워로디스

Java IO RandomAccessFile + FileChannel 예제 본문

정리/Java

Java IO RandomAccessFile + FileChannel 예제

워로디스 2026. 2. 4. 22:07

Java NIO (New Input/Output)에서 채널(Channel)은 파일이나 네트워크 소켓 등의 I/O 서비스에 대한 연결을 나타냅니다. Java NIO의 FileChannel 클래스는 파일에 대한 랜덤 엑세스를 가능하게 합니다. 이 클래스를 사용하면 파일의 특정 위치로 이동하여 데이터를 읽거나 쓸 수 있습니다.

 

RandomAccessFile 클래스와 함께 FileChannel을 사용하여 파일에 랜덤 엑세스를 수행할 수 있습니다. 예를 들어, 파일에서 특정 위치로 이동하고 데이터를 읽거나 쓰는 것이 가능합니다.

 

다음은 Java NIO를 사용하여 파일에 랜덤 엑세스하는 간단한 예제입니다.

import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class RandomAccessExample {
    public static void main(String[] args) {
        try {
            RandomAccessFile file = new RandomAccessFile("example.txt", "rw");
            FileChannel channel = file.getChannel();

            // 버퍼 생성
            ByteBuffer buffer = ByteBuffer.allocate(48);

            // 파일의 특정 위치로 이동
            channel.position(100);

            // 데이터 읽기
            int bytesRead = channel.read(buffer);

            // 데이터 쓰기
            String newData = "New Data";
            buffer.clear();
            buffer.put(newData.getBytes());
            buffer.flip();
            while (buffer.hasRemaining()) {
                channel.write(buffer);
            }

            channel.close();
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

이 예제에서는 RandomAccessFile을 "rw" 모드(읽기 및 쓰기 모드)로 열고, 이를 통해 FileChannel을 얻습니다. 그 후 ByteBuffer를 사용하여 파일의 특정 위치로 이동하고 데이터를 읽거나 쓸 수 있습니다.

 

RandomAccessFile만 사용하는 것과 FileChannel을 추가로 사용하는 것 사이에는 여러 차이점과 장점이 있습니다. FileChannel을 사용하는 주요 장점은 다음과 같습니다.

 

  1. 성능 향상: FileChannel은 네이티브 I/O 연산을 사용하여 성능을 향상시킵니다. 이는 특히 대용량 데이터를 처리할 때 중요합니다. FileChannel은 시스템의 기본 I/O 기능을 더 효율적으로 사용하여 빠른 데이터 전송을 가능하게 합니다.
  2. 비동기 I/O: FileChannel은 비동기 I/O 작업을 지원합니다. 이는 I/O 작업을 수행하는 동안 다른 작업을 계속할 수 있음을 의미합니다. 이는 애플리케이션의 전반적인 반응성과 성능을 개선할 수 있습니다.
  3. 메모리 매핑: FileChannel을 사용하면 파일을 메모리에 매핑할 수 있습니다. 이는 매우 큰 파일을 효율적으로 처리할 때 유용합니다. 메모리 매핑을 통해 파일의 일부를 메모리에 직접 매핑하여, 파일 I/O를 메모리 연산처럼 수행할 수 있습니다.
  4. 버퍼를 이용한 데이터 전송: FileChannelByteBuffer를 사용하여 데이터를 읽고 씁니다. 이는 데이터를 더 효율적으로 관리하고, 대량의 데이터를 빠르게 전송하는 데 도움이 됩니다.
  5. 다른 채널과의 직접적인 데이터 전송: FileChannel은 한 채널에서 다른 채널로 데이터를 직접 전송하는 기능을 제공합니다 (transferTotransferFrom 메소드). 이는 중간 버퍼를 사용하지 않고도 효율적으로 데이터를 전송할 수 있게 해줍니다.
  6. 락 기능: FileChannel은 파일에 대한 락(lock)을 설정할 수 있는 기능을 제공합니다. 이는 다중 스레드 환경이나 다중 프로세스 환경에서 파일의 동시 접근을 제어하는 데 유용합니다.

 

결론적으로, FileChannel을 사용하면 더 높은 성능, 효율적인 데이터 관리, 비동기 처리, 메모리 매핑 등의 이점을 얻을 수 있어, 특히 대용량 데이터 처리나 복잡한 I/O 요구 사항이 있는 애플리케이션에서 유리합니다.

'정리 > Java' 카테고리의 다른 글

Java IO RandomAccessFile 만으로 파일 읽기  (0) 2026.02.04
Java IO 절대경로 여부 확인  (0) 2026.02.04