2010-10-31 2 views
6

Я хотел бы знать, как сделать глубокую копию InputStream.Как сделать глубокую копию InputStream в Java

Я знаю, что это можно сделать с помощью пакетов IOUtils, но я хотел бы избежать их, если это возможно. Кто-нибудь знает альтернативный путь?

+0

Почему вы хотите сделать это? Afaik вы не можете читать дважды из одного потока. – thejh

+0

По какой-то странной причине я думаю, что мой поток потребляется, как только я его использовал. Поэтому, чтобы понять, что это не так, я хотел бы сделать глубокую копию. Я работаю с Android и получаю изображения из веб-сервиса с использованием архитектуры REST. – Spredzy

+4

Почему бы вам не показать нам соответствующий код и не объяснить фактическую проблему, с которой вы сталкиваетесь? –

ответ

16

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

+0

Что вы обычно используете с этим методом DEFAULT_BUFFER_SIZE? –

Смежные вопросы