"안녕, 아미고!"

"안녕, 엘리!"

"오늘 우리는 I/O 스트림을 공부할 것입니다."

"예, 이미 모든 것을 알고 있습니다. 여기서는 FileInputStream 및 FileOutputStream 클래스를 사용합니다."

"그래, 그리고 이 클래스의 메서드 중 어떤 것을 알고 있니?"

"물론입니다. 다음은 FileInputStream의 메소드입니다."

방법 설명
int read() 1바이트를 읽고 반환합니다.
int read(byte b[]) 바이트 배열을 읽고 반환합니다.
int read(byte b[], int off, int len) 스트림에서 바이트 배열을 읽습니다.
long skip(long n) 스트림에서 읽을 때 사용되는 n 바이트를 건너뜁니다.
int available() 스트림에서 여전히 읽을 수 있는 바이트 수를 반환합니다.
void close() 스트림을 닫습니다.

"정확히! 그리고 FileOutputStream의 메소드는?"

"구경하다:"

방법 설명
void write(int b) 스트림에 1바이트를 씁니다.
void write(byte b[]) 스트림에 바이트 배열을 씁니다.
void write(byte b[], int off, int len) 스트림에 바이트 배열을 씁니다.
void close() 스트림을 닫습니다.

"아미고, 당신은 나를 놀라게!"

"다음 몇 가지!"

"좋아요, 그럼 ZipInputStream과 ZipOutputStream이라는 두 가지 새로운 클래스를 제공하겠습니다."

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

" Zip ? zip 파일 같은 건가요?"

"정확합니다. 이 스트림은 zip 파일과 함께 작동하도록 설계되었습니다. 이를 사용하여 zip 파일을 바로 읽거나 쓸 수 있습니다!"

"이런 몰리! 재미있군. 하지만 zip 파일은 하나가 아니라 여러 개일 수 있어. 어떻게 작동하지?"

"이를 위해 ZipEntry 라는 또 다른 특수 클래스가 있습니다 . 아카이브에 저장된 파일을 제공합니다. ZipInputStream 에서 ZipEntry 객체만 읽을 수 있고 ZipOutputStream 에만 ZipEntry 객체를 쓸 수 있습니다. 일반 파일처럼 ZipEntry 에 씁니다 ."

"어떻게 작동하는지 예를 들어 주시겠습니까?"

"물론입니다. 다음은 아카이브를 생성하고 그 안에 파일을 넣는 예입니다."

암호
// 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를 설명하는 객체를 반환합니다(현재 항목의 모든 바이트 건너뛰기).
void closeEntry() 현재 ZipEntry에서 입력 스트림을 닫습니다(현재 항목의 모든 바이트를 건너뜁니다).
int available() 사용 가능한 ZipEntries가 있으면 1을 반환하고 그렇지 않으면 0을 반환합니다.
int read(byte[] b, int off, int len) 현재 ZipEntry에서 바이트를 읽습니다.
long skip(long n) 스트림에서 읽을 때 n바이트를 건너뜁니다.
void close() 스트림을 닫습니다.

"정말 이해가 안 돼요."

"가장 좋은 방법은 텍스트 파일을 읽고 있다고 상상하는 것입니다. ZipEntries는 파일의 라인과 같습니다. 현재 라인(현재 ZipEntry )에서 데이터를 읽거나 라인 간에 이동할 수 있습니다( 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) 현재 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() 항목이 디렉토리입니까?

"그렇게 어려워 보이지는 않아. 사랑할 게 뭐가 있겠어!"

"훌륭합니다. 그러면 디에고가 이 주제에 대한 과제도 줄 것입니다."

"입 다물고 있어야 했어."