본문 바로가기
Java/자바 Stream

[Java] 87. 파일 복사(문자기반 입/출력), ZIP으로 압축

글: Song hyun 2024. 5. 21.
728x90
반응형

[Java] 87. 파일 복사(문자기반 입/출력), ZIP으로 압축

1. 시나리오 코드(1)

2. 시나리오 코드(2)


1. 시나리오 코드(1) - 문자기반 스트림을 활용한 파일복사 클래스 설계하기

-버퍼(BufferedReader/BufferedWriter)를 사용해 파일을 복사해보자. 

-이 둘은 버퍼를 사용해 읽기와 쓰기를 실행하는 함수이다.

-이들은 보조 스트림으로, 한 글자씩 읽어들이던 기반 스트림을 도와 한 줄씩 한꺼번에 프로그램에 전달한다.

=> 이 둘을 활용하면 더욱 쉽고 빠르게 읽고, 쓰기를 할 수 있다.

 

-FileReader/FileWriter: 이들은 character(Char) 형식의 파일을 읽고, 쓰는 기능일 제공한다.

ㄴread(): 인자로 입력받는 버퍼에 파일의 데이터를 읽어 저장한다. 

 

 

아래 스크린 샷을 살펴보면, Seoul.txt에 있던 글들이 copySeoul.txt에 고스란히 저장된 것을 알 수 있다.

 

 

이는 메인함수에서 호출된 FileCopyHelper 클래스 - copyFile() 메서드에서 실행된 것이다.

copyFile() 메서드를 살펴보면, 읽어들일 파일과 복사할 파일의 이름을 각각 String 자료형으로 입력받은 뒤,

FileReader/FileWriter 메서드를 통해 파일을 복사하고 있다는 것을 알 수 있다.

package io.ch07;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;

public class FileCopyHelper {

	// 파일 복사
	public static void copyFile(String readFilePath, String writerFilePath) {
		
		try (FileReader fr = new FileReader(readFilePath);
				FileWriter fw = new FileWriter(writerFilePath);){
			int c;
			while((c=fr.read())!=-1) {
				fw.write(c);
			}
			System.out.println("파일 복사 완료 : "+writerFilePath);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("파일 복사 중 오류 발생");
		}
		
	}
	
	
	// 파일 복사 - 버퍼 기능 활용
	public static void copyFileWithBuffer(String readFilePath, String writerFilePath) {
		try (
				BufferedReader bufferedReader = new BufferedReader(new FileReader(readFilePath));
				BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(writerFilePath));
				){
			
			// 버퍼를 활용하는 버퍼에 크기를 지정할 수 있다.
			char[] buffer = new char[1024];
			int numCharsRead; // 읽은 문자 수
			
			while((numCharsRead=bufferedReader.read(buffer))!=-1) {
				bufferedWriter.write(buffer,0,numCharsRead);
				System.out.println("numCharsRead : "+numCharsRead);
			}
			
			System.out.println("버퍼를 사용한 파일 복사 완료 : "+writerFilePath);
			
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("버퍼를 사용한 파일 복사 중 오류 발생");
		}
	}
	
	// 메인 함수
	public static void main(String[] args) {
		FileCopyHelper.copyFile("Seoul.txt", "copySeoul.txt");
		System.out.println("-------------------");
		FileCopyHelper.copyFileWithBuffer("Newyork.txt", "copyNewyork.txt");
		
	} // end of main
	
} // end of class

 

 

2. 시나리오 코드(2) - 바이트 기반 스트림을 활용한 Zip 파일 만들어 보기

아래와 같이 바이트 기반 스트림을 활용해 Zip 압축 파일을 만들어보자. 

 

파일을 압축하는 기능을 하는 zipFile() 메서드를 살펴보자.

 

먼저 파라미터를 살펴보면 String 자료형인 fileToZip, zipFileName을 받는 것을 알 수 있다.

이 두 변수는 각각 FileInputStream, ZiptOutputStream 클래스의 파라미터로 사용된다.

fileToZip은 FileInputStream의 파라미터에 넣어지면서 파일이 읽히게 된다.

이렇게 읽어들인 파일은 다시 ZipoutputStream을 통해 압축되게 된다.

 

-FileInputStream: 생성자에 담긴 파일의 주소를 찾아, 바이트 스트림으로 읽기 위해 FileinputStream 객체를 생성한다.

-ZipOutputStream: Zip 파일 형식으로 파일을 쓰기 위한 출력 스트림이다.

-ZipEntry: Zip 파일 항목을 나타낼 때 쓰이는 클래스이다. (압축 파일 내에서 개별 파일을 나타낸다.)

-putNextEntry: 새 ZIP 파일 항목 쓰기를 시작할 때 쓰인다.

 

 

package io.ch07;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipFileHelper {
	
	// 파일을 압축하는 기능 - zip
	
	public static void zipFile(String fileToZip, String zipFileName) {
		
		// ZipOutputStream 을 사용해서, ZiP 형식으로 데이터를 압축할 수 있다.
		// FileOutputStream 을 활용해서 설정
		
		try (// 기반 스트림
				FileInputStream fis = new FileInputStream(fileToZip);
				// 보조 스트림 - 압축하는 기능
				ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFileName));){
			// ZipEntry 객체 생성 - 압축 파일 내에서 개별 파일을 나타냅니다.
			ZipEntry zipEntry = new ZipEntry(fileToZip);
			zos.putNextEntry(zipEntry);
			
			// 파일 내용을 읽고 ZIP 파일에 쓰기 위한 버퍼 생성
			byte[] bytes = new byte[1024];
			int length;
			
			while((length = fis.read(bytes))>=0) {
				zos.write(bytes,0,length);
			}
			
			zos.closeEntry();
			System.out.println("ZIP 파일 생성 완료 : "+zipFileName);
			
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("ZIP 파일 생성 시 오류 발생");
		}
		
	}
	
	public static void main(String[] args) {
		
		ZipFileHelper.zipFile("seoul.txt", "zipSeoul.zip");
		
	} // end of main

} // end of class
728x90
반응형