„Здрасти, Амиго!“
„Здравей, Ели!“
„Днес ще изучаваме 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.“
" 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() |
Записът директория ли е? |
"Това не изглежда много трудно. Какво няма да обичаш!"
— Отлично, тогава Диего ще ти даде задачи и по тази тема.
— Трябваше да си държа устата затворена.
GO TO FULL VERSION