[java] 자바 비동기 IO를 활용한 파일 압축 및 해제 처리 방법

파일 압축과 해제는 많은 경우에 유용한 작업입니다. 이러한 작업을 빠르고 효율적으로 처리하기 위해 자바에서 비동기 IO를 활용할 수 있습니다. 비동기 IO는 여러 개의 작업을 동시에 처리하고 완료된 작업만 수신하는 방식으로 작동합니다.

1. 파일 압축하기

다음은 자바에서 파일을 압축하는 방법입니다.

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

public class FileCompressor {
    public static void compressFile(File sourceFile, File compressedFile) throws IOException {
        FileInputStream fis = new FileInputStream(sourceFile);
        FileOutputStream fos = new FileOutputStream(compressedFile);
        GZIPOutputStream gzipOS = new GZIPOutputStream(fos);

        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = fis.read(buffer)) != -1) {
            gzipOS.write(buffer, 0, bytesRead);
        }

        gzipOS.close();
        fos.close();
        fis.close();

        System.out.println("압축이 완료되었습니다.");
    }
}

위의 코드는 FileCompressor 클래스를 정의하고 compressFile 메소드를 사용하여 파일을 압축합니다. 압축할 원본 파일과 압축 파일 정보를 인자로 전달해야 합니다. GZIPOutputStream 클래스를 사용하여 GZIP 압축을 수행합니다.

2. 파일 해제하기

압축된 파일을 해제하는 방법은 다음과 같습니다.

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

public class FileDecompressor {
    public static void decompressFile(File compressedFile, File decompressedFile) throws IOException {
        FileInputStream fis = new FileInputStream(compressedFile);
        GZIPInputStream gzipIS = new GZIPInputStream(fis);
        FileOutputStream fos = new FileOutputStream(decompressedFile);

        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = gzipIS.read(buffer)) != -1) {
            fos.write(buffer, 0, bytesRead);
        }

        fos.close();
        gzipIS.close();
        fis.close();

        System.out.println("해제가 완료되었습니다.");
    }
}

위의 코드는 FileDecompressor 클래스를 정의하고 decompressFile 메소드를 사용하여 압축된 파일을 해제합니다. 해제할 압축 파일과 해제된 파일 정보를 인자로 전달해야 합니다. GZIPInputStream 클래스를 사용하여 GZIP 압축을 해제합니다.

3. 파일 압축 및 해제 비동기 처리

비동기 IO를 사용하여 파일 압축 및 해제 작업을 동시에 처리할 수 있습니다. 다음은 비동기 처리를 위해 CompletableFuture를 사용한 예제 코드입니다.

import java.io.*;
import java.util.concurrent.CompletableFuture;
import java.util.zip.*;

public class AsyncFileProcessor {
    public static CompletableFuture<Void> compressAndDecompress(File sourceFile, File compressedFile, File decompressedFile) {
        return CompletableFuture.runAsync(() -> {
            try {
                FileCompressor.compressFile(sourceFile, compressedFile);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).thenRunAsync(() -> {
            try {
                FileDecompressor.decompressFile(compressedFile, decompressedFile);
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }

    public static void main(String[] args) {
        File sourceFile = new File("source.txt");
        File compressedFile = new File("compressed.gz");
        File decompressedFile = new File("decompressed.txt");

        CompletableFuture<Void> future = compressAndDecompress(sourceFile, compressedFile, decompressedFile);
        future.join();
    }
}

위의 코드는 AsyncFileProcessor 클래스를 정의하고 compressAndDecompress 메소드를 사용하여 파일 압축 및 해제 작업을 비동기적으로 처리합니다. CompletableFuture를 사용하여 비동기 작업을 정의하고 실행합니다. 압축 및 해제 작업은 각각 별도의 스레드에서 동시에 실행되므로 빠르고 효율적으로 처리됩니다.

이제 자바에서 비동기 IO를 활용하여 파일 압축 및 해제 작업을 처리하는 방법을 알아보았습니다. 비동기 IO를 사용하면 작업을 동시에 처리하여 처리 속도와 성능을 향상시킬 수 있습니다.