Как работает InputStream.read(байт[])?

#java #fileinputstream #zipinputstream

#java #fileinputstream #zipinputstream

Вопрос:

Я пытаюсь распаковать zip-папку, у меня проблема с пониманием того, как ZipInputStream.read(byte[]) работает. Этот код работает просто отлично, но я не знаю, больше ли мой файл, чем буфер, который я устанавливаю, как я буду работать.

 byte[] buffer = new byte[1024];
zipIs = new ZipInputStream(new FileInputStream(FILE_PATH));
while ((entry = zipIs.getNextEntry()) != null) {

        String entryName = File.separator   entry.getName();

        // Call file input stream
        FileOutputStream fos = new FileOutputStream(entryName);

        int len;
        // Write current entry
        while ((len = zipIs.read(buffer)) > 0) {
            fos.write(buffer, 0, len);
        }
        fos.close();
      }
  

Я прочитал документ, но нахожу его запутанным, пожалуйста, помогите.

Ответ №1:

У меня проблема с пониманием того, как ZipInputStream.read(byte[]) работает.

Это описано в javadocs для InputStream.read(bytes[]) :

Этот код работает просто отлично, но я не знаю, больше ли мой файл, чем буфер, который я устанавливаю, как я буду работать.

Для этого и нужен цикл.

     while ((len = zipIs.read(buffer)) > 0) {
        fos.write(buffer, 0, len);
    }
  

Он считывает по одному буферу за раз, устанавливая len количество прочитанных байтов, пока read вызов не вернет ноль (или меньше). Каждый заполненный буфер записывается с использованием len , чтобы указать, сколько байт нужно записать, а затем он повторяется …

while ((a = call()) > 0) { Синтаксис просто использует тот факт, что присваивание (например, (a = call()) ) — это выражение, значение которого соответствует значению, присвоенному переменной.

Чтение потоков — это одна из ситуаций, когда эта идиома обычно используется. Это стоит запомнить.