http://eincs.com/2009/08/java-nio-bytebuffer-channel/
- ByteBuffer만이 Direct Buffer가 가능!
- ByteBuffer.allocateDirect()메소드를 사용해야 Direct Buffer가 생성됨!
위와 같이 File에 문자 기반 I/O를 사용하기 위해선 File path FileWriter
나 FileReader
를 만들고 추가 기능을 위해 PrintWirter
, PrintReader
등의 클래스, 버퍼기능을 추가하여 속도향상을 하기 위해선 Buffered라는 접두어가 붙은 클래스를 이용하면 되었습니다. 참으로 데코레이터패턴을 효과적으로 쓴 케이스라고 할 수 있겠네요. 덕분이 처음 배우는 사람도 그나지 어렵지 않게 사용 할 수 있었습니다.
하지만 이런 기존 Java I/O는 상당히 느리고 비효율적이라는 평가를 많이 받았습니다. 실제로 그럴수밖에 없는 이유를 살펴보면 크게 두 가지입니다.
첫 번째 이유는 OS에서 관리하는 커널 버퍼에 직접 접근할 수 없었던 것
두 번째 이유는 Blocking I/O여서 매우 비효율적이었다는 것
...ㅇ ㅏ 어렵네 nio -directBuffer
NIO이용한 퍼포먼스 향상시키기
RandomAccessFile raf = new RandomAccessFile("sample.txt", "rw"); FileChannel channel = raf.getChannel(); ByteBuffer buf = ByteBuffer.allocateDirect(10); buf.clear(); raf.seek(10); // 파일의 10째 바이트로 파일포인터 이동 channel.read(buf); // channel에서 읽어 buf에 저장!buf.flip(); raf.seek(40); // 파일의 40째 바이트로 파일포인터 이동 channel.write(buf); // buf의 내용을 channel에 저장! channel.close(); raf.close();
반응형