#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())
) — это выражение, значение которого соответствует значению, присвоенному переменной.
Чтение потоков — это одна из ситуаций, когда эта идиома обычно используется. Это стоит запомнить.