FileChannel

Programming/Java NIO 2015. 9. 9. 16:52

Java NIO FileChannel은 파일에 연결된 채널이다. 파일채널을 사용하여 파일로부터 데이터를 읽을 수 있고, 파일에 데이터를 쓸 수 있다. Java NIO FileChannel 클래스는 NIO의 reading files with the standard Java IO API를 대신한다.


FileChannel은 비블럭킹 모드로 설정될 수 없다. 항상 블럭킹 모드로 동작한다.

Opening a FileChannel


FileChannel을 사용하기 전에 반드시 그것을 열어야 한다. FileChannel을 직접 열 수는 없다. InputStream, OutputStream, 혹은 RandomAccessFile을 통해 FileChannel을 얻어야 한다. 다음 RandomAccessFile을 통한 FileChannel을 여는 방법을 보여준다:

RandomAccessFile aFile     = new RandomAccessFile("data/nio-data.txt", "rw");
FileChannel      inChannel = aFile.getChannel();

Reading Data from a FileChannel


FileChannel에서 데이터를 읽기 위해 read() 메소드들중 하나를 호출한다. 다음 예제가 있다:

ByteBuffer buf = ByteBuffer.allocate(48);

int bytesRead = inChannel.read(buf);

먼저 Buffer가 할당된다. FileChannel로부터 읽은 데이터는 버퍼에 읽어진다.


그 뒤에 FileChannel.read() 메소드가 호출된다. 이 메소드는 Buffer에 FileChannel로부터 데이터를 읽는다. read() 메소드에 의해 반환된 int는 버퍼에 얼마나 많은 bytes가 쓰였는지를 말해준다. 만약 -1이 반환되면, 파일의 끝(end-of-file)에 도달했다는 것이다.

Writing Data to a FileChannel


FileChannel에 기록 데이터는 Buffer 매개변수를 갖는 FileChannel.write() 메소드를 사용하여 수행된다. 다음 예제가 있다:

String newData = "New String to write to file..." + System.currentTimeMillis();

ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());

buf.flip();

while(buf.hasRemaining()) {
    channel.write(buf);

FileChannel.write() 메소드가 while-loop 안에서 호출되는 방법에 주목하기 바란다. 이는 FileChannel에 write() 메소드로 얼마만큼의 bytes를 쓰는지 보장하지 않는다. 그러므로 Buffer가 더 이상 쓸 bytes가 없을 때까지 write() 호출을 반복한다.

Closing a FileChannel


FileChannel의 사용이 완료되었을 때 반드시 그것을 닫아야 한다. 다음 방법이 있다:

channel.close();    

FileChannel Position


FileChannel에 읽거나 쓸 때 특정 위치에 작업한다. position() 메소드를 호출함으로써 FileChannel 객체의 현재 위치를 얻을 수 있다.


position(long pos) 메소드를 호출하여 FileChannel의 위치를 설정할 수도 있다.


다음 두 예제가 있다:

long pos channel.position();

channel.position(pos +123);

만약 파일의 끝 뒤에 위치를 설정하고 채널로부터 읽으려고 시도한다면, 파일의 끝 표시인 -1을 얻을 것이다.


만약 파일의 끝 뒤에 위치를 설정하고 채널에 쓰면, 그 파일은 쓰여지는 데이터의 위치에 알맞게 확장될 것이다. 이는 "파일 구멍"이라고 하는 디스크상의 실제 파일과 쓰여진 데이터의 차이가 생기는 결과를 초래할 지도 모른다.

FileChannel Size


FileChannel 객체의 size() 메소드는 연결된 채널 파일의 파일 크기를 반환한다. 다음 간단한 예제가 있다:

long fileSize = channel.size();    

FileChannel Truncate


FileChannel.truncate() 메소드를 호출하여 파일을 자를 수 있다. 파일을 자를 때,  주어진 길이만큼 자른다. 다음 예제가 있다:

channel.truncate(1024);

이 예제는 1024 bytes만큼 파일을 자른다.

FileChannel Force


FileChannel.force() 메소드는 디스크에 채널로부터 쓰여지지 않은 데이터 모두를 플러시한다. 운영체제는 메모리에 성능 문제 때문에 캐쉬 데이터를 갖고있기에, force() 메소드를 호출할 때 까지 채널에 쓰여진 데이터가 디스크에 실질적으로 쓰여있는지 보장받을 수 없다.


force() 메소드는 boolean 타입을 매개변수로 취하고, 파일 메타 데이터(권한 등) 또한 플러시 되었는지를 말해준다.


다음 데이터와 메타 데이터 둘다 플러시 하는 예제가 있다:

channel.force(true);



<원문 출처>

'Programming > Java NIO' 카테고리의 다른 글

ServerSocketChannel  (0) 2015.09.10
SocketChannel  (0) 2015.09.10
Selector  (0) 2015.09.09
Channel to Channel Transfers  (0) 2015.09.09
Scatter / Gather  (0) 2015.09.08
Posted by 레미파
,