Я хотел бы знать, как сделать глубокую копию InputStream
.Как сделать глубокую копию InputStream в Java
Я знаю, что это можно сделать с помощью пакетов IOUtils, но я хотел бы избежать их, если это возможно. Кто-нибудь знает альтернативный путь?
Я хотел бы знать, как сделать глубокую копию InputStream
.Как сделать глубокую копию InputStream в Java
Я знаю, что это можно сделать с помощью пакетов IOUtils, но я хотел бы избежать их, если это возможно. Кто-нибудь знает альтернативный путь?
InputStream является абстрактным и не раскрывает (не делает его дочерние) внутренние объекты данных. Таким образом, единственный способ «глубокой копии» InputStream - создать ByteArrayOutputStream и после выполнения read() в InputStream записать() эти данные в ByteArrayOutputStream. Затем сделайте:
newStream = new ByteArrayInputStream(byteArrayOutputStream.toArray());
Если вы используете mark()
на вашем InputStream, то на самом деле вы не можете изменить это. Это заставляет ваш поток «потреблять».
Чтобы «повторно использовать» ваш InputStream, не используйте знак(), а затем в конце сброса вызова чтения(). Затем вы начнете чтение с начала потока.
Отредактировано:
BTW, IOUtils использует этот простой фрагмент кода, чтобы скопировать InputStream:
public static int copy(InputStream input, OutputStream output) throws IOException{
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int count = 0;
int n = 0;
while (-1 != (n = input.read(buffer))) {
output.write(buffer, 0, n);
count += n;
}
return count;
}
Подробнее: http://kickjava.com/src/org/apache/commons/io/CopyUtils.java.htm#ixzz13ymaCX9m
Что вы обычно используете с этим методом DEFAULT_BUFFER_SIZE? –
Почему вы хотите сделать это? Afaik вы не можете читать дважды из одного потока. – thejh
По какой-то странной причине я думаю, что мой поток потребляется, как только я его использовал. Поэтому, чтобы понять, что это не так, я хотел бы сделать глубокую копию. Я работаю с Android и получаю изображения из веб-сервиса с использованием архитектуры REST. – Spredzy
Почему бы вам не показать нам соответствующий код и не объяснить фактическую проблему, с которой вы сталкиваетесь? –