본문 바로가기

JAVA/Object

JAVA에서 IO의 단점. 그리고 보완된 NIO

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();


반응형