„Здрасти, Амиго!“

„Здравей, Ели!“

„Днес ще изучаваме I/O потоци.“

„Да, вече знам всичко за тях. Тук използваме класовете FileInputStream и FileOutputStream.“

„Да, и кои от методите на тези класове знаете?“

„Разбира се. Ето методите на FileInputStream:“

Метод Описание
int read() Чете един byte и го връща.
int read(byte b[]) Чете byteов масив и го връща.
int read(byte b[], int off, int len) Чете byteов масив от потока.
long skip(long n) Пропуска n byteа, използвани при четене от потока.
int available() Връща броя byteове, които все още могат да бъдат прочетени от потока.
void close() Затваря потока.

"На място! А методите на FileOutputStream?"

"Погледни:"

Метод Описание
void write(int b) Записва един byte в потока.
void write(byte b[]) Записва масив от byteове в потока.
void write(byte b[], int off, int len) Записва масив от byteове в потока.
void close() Затваря потока.

"Амиго, изненадвате ме!"

— И после малко!

„Добре, тогава ще ви дам два нови класа: ZipInputStream и ZipOutputStream.“

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

" Zip ? Това като zip файл ли е?"

"Точно така. Тези потоци са проектирани да работят с zip файлове. Можете да ги използвате, за да четете or пишете направо в zip файл!"

„Господи! Колко интересно. Но един zip файл може да има не един файл, а няколко. Как работят?“

„За това има друг специален клас: ZipEntry . Той представя файл, съхранен в архива. Можете да четете ZipEntry обекти само от ZipInputStream и можете само да пишете ZipEntry обекти в ZipOutputStream . Но се оказва, че можете да четете и пишете в ZipEntry точно като обикновен файл."

„Бихте ли ми дали пример How работи?“

„Разбира се. Ето пример, в който създаваме архив и поставяме файл в него:“

Код
// Create an archive
FileOutputStream zipFile = new FileOutputStream("c:/archive.zip");
ZipOutputStream zip = new ZipOutputStream(zipFile);

//Put a ZipEntry into it
zip.putNextEntry(new ZipEntry("document.txt"));

//Copy the file «document-for-archive.txt» to the archive under the name «document.txt»
File file = new File("c:/document-for-archive.txt");
Files.copy(file.toPath(), zip);

// Close the archive
zip.close();

„Колко интересно! И разархивирането на файлове е също толкова лесно?“

"Да. Ето кратко описание на методите на класовете ZipEntry , ZipInputStream   и ZipOutputStream "

" ZipInputStream е поток, така че всички ZipEntry могат да се четат само последователно. Ето неговите методи:"

Метод Описание
ZipEntry getNextEntry() Връща обект, описващ следващия ZipEntry (прескача всички byteове в текущия запис).
void closeEntry() Затваря входния поток на текущия ZipEntry (прескача всички byteове в текущия запис).
int available() Връща 1 има налични ZipEntries, в противен случай 0.
int read(byte[] b, int off, int len) Чете byteове от текущия ZipEntry.
long skip(long n) Пропуска n byteа при четене от потока.
void close() Затваря потока.

— Наистина не разбирам.

„Най-доброто нещо, което можете да направите, е да си представите, че четете текстов файл и ZipEntries са като редове във file. Можете да четете данни от текущия ред (текущият ZipEntry) or да прескачате от ред на ред ( getNextEntry , closeEntry ) ."

— Мисля, че разбирам, но не съм сигурен.

„Ето ZipOutputStream и неговите методи:“

Метод Описание
void setComment(String comment) Задава коментар на архива.
void setMethod(int method) Задава метода (типа) на компресия.
void setLevel(int level) Задава нивото на компресия. Колкото по-висока е компресията, толкова по-бавно става.
void putNextEntry(ZipEntry e) Добавя нов ZipEntry.
void closeEntry() Затваря текущия ZipEntry
void write(byte[] b, int off, int len) Записва набор от byteове в текущия ZipEntry.
void close() Затваря потока.

„Но в горния пример не използвахме почти нищо от това.“

„Това са незадължителни методи. Не е необходимо да указвате нивото и метода на компресиране – ще се използват настройките по подразбиране.“

„Хмм. Това не е толкова лошо. А ZipEntry?“

„Разбира се. Единствената друга информация в ZipEntry е информацията за домакинството:“

Метод Описание
String getName(), setName(String) Файл с вътрешни имена.
long getTime(), setTime(long) Последният път, когато записът беше променен.
long getCRC(), setCRC(long) Контролна сума.
long getSize(), setSize(long) Размер преди компресия.
int getMethod(), setMethod(int) Метод на компресия.
long get/setCompressedSize() Размер след закопчаване с цип.
boolean isDirectory() Записът директория ли е?

"Това не изглежда много трудно. Какво няма да обичаш!"

— Отлично, тогава Диего ще ти даде задачи и по тази тема.

— Трябваше да си държа устата затворена.