"Olá, amigo!"

"Oi, Ellie!"

"Hoje vamos estudar fluxos de I/O."

"Sim, eu já sei tudo sobre eles. Usamos as classes FileInputStream e FileOutputStream aqui."

"Sim, e quais métodos dessas classes você conhece?"

"Claro. Aqui estão os métodos de FileInputStream:"

Método Descrição
int read() Lê um byte e o retorna.
int read(byte b[]) Lê uma matriz de bytes e a retorna.
int read(byte b[], int off, int len) Lê uma matriz de bytes do fluxo.
long skip(long n) Ignora n bytes, usados ​​durante a leitura do fluxo.
int available() Retorna o número de bytes que ainda podem ser lidos do fluxo.
void close() Fecha o fluxo.

"Spot on! E os métodos de FileOutputStream?"

"Dê uma olhada:"

Método Descrição
void write(int b) Grava um byte no fluxo.
void write(byte b[]) Grava uma matriz de bytes no fluxo.
void write(byte b[], int off, int len) Grava uma matriz de bytes no fluxo.
void close() Fecha o fluxo.

"Amigo, você me surpreendeu!"

"E então alguns!"

"Tudo bem, então darei a você duas novas classes: ZipInputStream e ZipOutputStream."

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

" Zip ? É como um arquivo zip?"

"Exatamente. Esses fluxos são projetados para funcionar com arquivos zip. Você pode usá-los para ler ou gravar diretamente em um arquivo zip!"

"Caramba! Que interessante. Mas um arquivo zip não pode ter um arquivo, mas vários. Como eles funcionam?"

"Para isso, existe outra classe especial: ZipEntry . Ela apresenta um arquivo armazenado no arquivo. Você só pode ler objetos ZipEntry de um ZipInputStream e só pode gravar objetos ZipEntry em um ZipOutputStream . Mas acontece que você pode ler e gravar em um ZipEntry como um arquivo normal."

"Você poderia me dar um exemplo de como isso funciona?"

"Claro. Aqui está um exemplo em que criamos um arquivo e colocamos um arquivo nele:"

Código
// 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();

"Que interessante! E descompactar arquivos é tão fácil quanto?"

"Sim. Aqui está uma breve descrição dos métodos das classes ZipEntry , ZipInputStream   e ZipOutputStream "

" ZipInputStream é um stream, então todo o ZipEntry só pode ser lido sequencialmente. Aqui estão seus métodos:"

Método Descrição
ZipEntry getNextEntry() Retorna um objeto que descreve o próximo ZipEntry (pula todos os bytes na entrada atual).
void closeEntry() Fecha o fluxo de entrada no ZipEntry atual (pula todos os bytes na entrada atual).
int available() Retorna 1 se houver ZipEntries disponíveis, caso contrário, 0.
int read(byte[] b, int off, int len) Lê bytes do ZipEntry atual.
long skip(long n) Ignora n bytes ao ler do fluxo.
void close() Fecha o fluxo.

"Eu realmente não entendo."

"A melhor coisa a fazer é imaginar que você está lendo um arquivo de texto e ZipEntries são como linhas no arquivo. Você pode ler dados da linha atual (o ZipEntry atual) ou pular de linha em linha ( getNextEntry , closeEntry ) ."

"Acho que entendo, mas não tenho certeza."

"Aqui está o ZipOutputStream e seus métodos:"

Método Descrição
void setComment(String comment) Define um comentário no arquivo.
void setMethod(int method) Define o método de compactação (tipo).
void setLevel(int level) Define o nível de compactação. Quanto maior a compressão, mais lento ele vai.
void putNextEntry(ZipEntry e) Adiciona um novo ZipEntry.
void closeEntry() Fecha o ZipEntry atual
void write(byte[] b, int off, int len) Grava um conjunto de bytes no ZipEntry atual.
void close() Fecha o fluxo.

"Mas no exemplo acima não usamos quase nada disso."

"Esses são métodos opcionais. Você não precisa especificar o nível e o método de compactação - as configurações padrão serão usadas."

"Hmm. Isso não é tão ruim. E ZipEntry?"

"Claro. A única outra informação em um ZipEntry são informações de limpeza:"

Método Descrição
String getName(), setName(String) Arquivo de nome interno.
long getTime(), setTime(long) Última vez que a entrada foi modificada.
long getCRC(), setCRC(long) Soma de verificação.
long getSize(), setSize(long) Tamanho antes da compressão.
int getMethod(), setMethod(int) Método de compressão.
long get/setCompressedSize() Tamanho depois de fechar.
boolean isDirectory() A entrada é um diretório?

"Isso não parece muito difícil. O que não há para amar!"

"Excelente, então Diego vai te dar tarefas sobre esse assunto também."

"Eu deveria ter mantido minha boca fechada."