[java] 자바 소켓 프로그래밍을 이용한 파일 압축과 압축 해제

자바 소켓 프로그래밍은 네트워크 통신을 구현하는 데 사용되는 기술입니다. 파일의 압축과 압축 해제는 자바 소켓 프로그래밍을 통해 네트워크를 통해 파일을 전송하는 과정에서 중요한 역할을 합니다. 이번 블로그 포스트에서는 자바 소켓 프로그래밍을 이용하여 파일을 압축하고 압축을 해제하는 방법에 대해 알아보겠습니다.

파일 압축하기

파일을 압축하기 위해서는 java.util.zip 패키지에 있는 ZipOutputStream 클래스를 사용합니다. 아래는 파일을 압축하는 예제 코드입니다.

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class FileCompressor {

    public static void compressFile(String filePath, String zipFilePath) {
        try {
            FileOutputStream fos = new FileOutputStream(zipFilePath);
            ZipOutputStream zipOut = new ZipOutputStream(fos);
            File fileToCompress = new File(filePath);

            FileInputStream fis = new FileInputStream(fileToCompress);
            ZipEntry zipEntry = new ZipEntry(fileToCompress.getName());
            zipOut.putNextEntry(zipEntry);

            byte[] bytes = new byte[1024];
            int length;
            while ((length = fis.read(bytes)) >= 0) {
                zipOut.write(bytes, 0, length);
            }

            fis.close();
            zipOut.close();
            fos.close();

            System.out.println("파일이 성공적으로 압축되었습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String filePath = "C:/path/to/file.txt";
        String zipFilePath = "C:/path/to/compressed/file.zip";
        compressFile(filePath, zipFilePath);
    }
}

위 코드에서 compressFile 메서드는 압축할 파일의 경로와 압축된 파일의 경로를 매개변수로 받아 파일을 압축합니다. ZipOutputStream 클래스를 통해 파일을 압축하고, FileInputStream 클래스를 통해 파일을 읽어 압축된 파일에 기록합니다.

파일 압축 해제하기

파일을 압축 해제하기 위해서는 java.util.zip 패키지에 있는 ZipInputStream 클래스를 사용합니다. 아래는 파일을 압축 해제하는 예제 코드입니다.

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class FileDecompressor {

    public static void decompressFile(String zipFilePath, String destDirectory) {
        try {
            File destDir = new File(destDirectory);
            if (!destDir.exists()) {
                destDir.mkdirs();
            }
            FileInputStream fis = new FileInputStream(zipFilePath);
            ZipInputStream zipIn = new ZipInputStream(fis);
            ZipEntry entry;

            while ((entry = zipIn.getNextEntry()) != null) {
                String filePath = destDirectory + File.separator + entry.getName();
                if (!entry.isDirectory()) {
                    extractFile(zipIn, filePath);
                } else {
                    File dir = new File(filePath);
                    dir.mkdirs();
                }
                zipIn.closeEntry();
            }

            zipIn.close();
            fis.close();

            System.out.println("파일이 성공적으로 압축 해제되었습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
        byte[] bytes = new byte[1024];
        int length;
        while ((length = zipIn.read(bytes)) >= 0) {
            bos.write(bytes, 0, length);
        }
        bos.close();
    }

    public static void main(String[] args) {
        String zipFilePath = "C:/path/to/compressed/file.zip";
        String destDirectory = "C:/path/to/extracted/files";
        decompressFile(zipFilePath, destDirectory);
    }
}

위 코드에서 decompressFile 메서드는 압축 해제할 파일의 경로와 압축 해제된 파일들의 저장 경로를 매개변수로 받아 파일을 압축 해제합니다. ZipInputStream 클래스를 통해 압축 파일을 읽고, extractFile 메서드를 사용하여 압축 해제될 파일들을 저장합니다.

결론

이번 포스트에서는 자바 소켓 프로그래밍을 이용하여 파일을 압축하고 압축을 해제하는 방법에 대해 알아보았습니다. ZipOutputStream 클래스를 사용하여 파일을 압축하고, ZipInputStream 클래스를 사용하여 파일을 압축 해제할 수 있습니다. 파일 압축과 압축 해제는 네트워크 파일 전송에서 유용하게 사용될 수 있습니다.