본문 바로가기

Java

[NIO] FileChannel 과 FileInput/Output Stream 과의 차이

 

FileChannel Java java.nio.channels 패키지에 속하는 클래스로, 파일에서 데이터를 읽고, 쓰고, 매핑하는 기능을 제공한다.

 

FileChannel 입출력(I/O) 작업에 대해 높은 성능과 유연성을 제공하는 NIO (New Input/Output) 핵심 요소 하나이다. 클래스는 버퍼와 채널을 사용하여 파일의 데이터를 직접 조작할 있는 메커니즘을 제공하여, 기존의 FileInputStream, FileOutputStream, RandomAccessFile 등을 통한 데이터 처리 방식보다 효율적인 작업이 가능하다.

 

 

FileChannel의 주요 역할

 

  1. 읽기 쓰기 작업: FileChannel 통해 파일의 특정 위치에서 데이터를 읽거나 있다. 이를 통해 순차적이 아닌 임의의 위치에 접근하는 랜덤 액세스가 가능하다.
  2. 버퍼와의 상호 작용: FileChannel ByteBuffer 함께 사용되어, 데이터를 버퍼에 쓰거나 버퍼에서 읽어올 있다. 과정에서 직접 메모리(Direct Memory) 사용할 수도 있어, 시스템의 메모리 복사 과정을 줄여 성능을 향상시킨다.
  3. 메모리 매핑 (Memory-Mapped Files): 파일 일부를 메모리에 매핑하여, 대용량 파일을 효율적으로 처리할 있다. 메모리 매핑을 사용하면 파일의 데이터를 마치 메모리에 있는 데이터처럼 접근할 있어, 대규모 데이터 처리가 필요한 경우 매우 유용하다.
  4. 파일 잠금 (File Locking): FileChannel 사용하여 파일 일부 또는 전체에 대한 잠금을 설정할 있습니다. 기능은 파일을 여러 프로세스가 동시에 접근하는 환경에서 데이터 무결성을 보장하는 필요하다.
  5. 효율적인 데이터 전송: transferTo transferFrom 메소드를 통해, 채널에서 다른 채널로 데이터를 직접 전송할 있다. 기능은 네트워크를 통한 파일 전송과 같은 작업에서 데이터 복사 비용을 줄여 성능을 향상시킨다.

 

아래는 실제 내가 하고 있는 개인 프로젝트에서 사용하고 있는 예제이다.

 

public ByteBuffer read(Path path, int lower, int upper) throws IOException {
        ByteBuffer buffer;
        try (FileInputStream fis = new FileInputStream(path.toFile()); FileChannel fileChannel = fis.getChannel()) {
            buffer = ByteBuffer.allocateDirect(upper - lower + 1);

            fileChannel.position(lower);
            fileChannel.read(buffer);
        }

        return buffer;
    }

 

코드를 보면 DirectByteBuffer 와 FileChannel 을 사용하여 특정 영역 (lower ~ upper) 사이의 byte 만을 native memory 영역으로 직접 할당함을 알 수 있다.

'Java' 카테고리의 다른 글

[NIO] Selection  (0) 2021.05.08
[NIO] Socket Channel  (0) 2021.05.08