2016-07-13 3 views
0

Рассмотрите следующий фрагмент кода getInputStreamForRead() метод создает и возвращает новый поток ввода для чтения.Повторное использование переменной входного потока

InputStream is = getInputStreamForRead(); //This method creates and returns an input stream for file read 
is = getDecompressedStream(is); 

Поскольку исходное содержимое файла сжимается и сохраняется, его необходимо разжать при чтении. Поэтому getDecompressedStream() ниже метод даст возможность распаковывать потока контента

public InputStream getDecompressedStream(InputStream is) throws Exception { 
return new GZIPInputStream(is); 
} 

имеют следующие сомнения

  1. Какой из них правильный для приведенного выше фрагмента кода

    is = getDecompressedStream(is) 
    

    или

    InputStream newStream = getDecompressedStream(is) 
    
  2. Повторное использование переменной InputStream приведет к возникновению каких-либо проблем?

Я совершенно новый с потоками. Пожалуйста, помогите мне узнать об этом.

+0

Я считаю, что входной поток - это еще один объект, и он будет переназначен новым значением. 1 должно быть нормально. – SomeDude

+0

Вы можете протестировать это самостоятельно, попробовав его. Но они оба сделают то же самое. Оба являются допустимыми параметрами – Adam

+0

Могу ли я предположить/понять как экземпляр потока, похожий на экземпляр класса? Или экземпляр потока имеет какие-то исключения? – lsof

ответ

1

Пока:

  • вы не манипулируя оригинальный InputStream между первоначальным назначением и новым вызовом
  • вы всегда закрываете потоки в finally заявлении

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

В самом деле, что может быть рекомендуемым способом, так как вы получите только один близкий Closeable программно, а GZIPInputStream#close ...

Замыкает этот входной поток и освобождает все системные ресурсы, связанные с потоком.

(см. here - Я читал это как «закрывает базовый поток»).

1

Поскольку вы хотите правильно закрыть входной поток, лучший способ - создать входной поток с помощью цепочки и использовать try-with-resources для обработки закрытия для вас.

try (InputStream is = getDecompressedStream(getInputStreamForRead())) { 
    // code using stream here 
} 
+0

Да @ Andreas Кажется, это хороший вариант для закрытия входного потока. Но я хотел бы знать, можно ли использовать поток ввода. то есть; Может ли переназначение экземпляра 'InputStream' каким-либо другим значением вызвать какие-либо проблемы. – lsof

+0

Для примера значение конечной переменной не может быть изменено.Аналогично, для переменной экземпляра 'InputStream', повторно использующей/переназначающей, это вызывает какие-либо проблемы? – lsof

+1

@RajasubaSubramanian. Вы комментируете комментарии, поэтому позвольте мне ответить следующим образом: 1) Переменная может быть повторно использована, вы просто теряете предыдущее значение при переназначении. Если вам больше не нужно это значение, проблем нет. 2) «InputStream» нельзя использовать повторно. Вы можете только прочитать поток один раз. – Andreas

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

  • Нет связанных вопросов^_^