자바 입출력

자바에서 파일을 읽고 조작하고 쓰기를 하는 작업을 할 떄, 소겟을 통해 데이터를 받고 보낼때 등 입출력에대한 작업을 할 떄 IO 패키지, NIO 패키지를 사용하게 되는데 자바 7 이상 버전에서 추가된 NIO 패키지를 사용하여 비동기 IO를 구현할 수 있습니다.

자바 NIO와 IO의 차이점은 다음과 같습니다

IONIO

Stream 기반

  • 한번에 하나 이상의 바이트를 읽어온다

  • 어디에서 캐시되지 않는다.

  • 읽어온 테이터는 앞뒤로 이동을 못한다.

  • input stream -> output stream

Channel/Buffer 기반

  • Channel은 Stream과 같은것으로 데이터 전송을 위한 데이터 소스와 Java 프로그램 간의 연결을 의미한다.

  • 데이터를 나중에 처리하기위해 Buffer로 읽어 온다.

  • 필요에 따라 앞뒤로 이동할 수 있다.

  • 버퍼를 완전히 처리하기 위해 필요한 모든 데이터가 버퍼에 포함되어 있는지 확인 해야 한다

  • 버퍼로 더 많은 데이터를 읽을 때 아직 처리하지 않은 버퍼의 데이터를 덮어쓰지 않도록 해야 한다.

객체에 직접 데이터를 쓰고 객체에서 직접 데이터를 읽는다.

모든 데이터는 버퍼로 처리되므로 데이터를 읽을 때 버퍼로에서 읽고 데이터가 기록되면 버퍼에 기한다. 즉, NIO의 데이터에 액세스할 때마다 버퍼에 있는 데이터를 사용한다.

Blocking IO - 스레드가 read()/write()를 호출하여 읽을 수 있는 데이터가 있거나 완전히 기록될 때까지 차단 된다.

Non Blocking IO - 반환하기 전에 데이터를 읽거나 쓸 때까지 기다리지 않습니다. - 스레드는 계속해서 다른 작업을 수행될 수 있다.

Selectors - 단일 스레드에서 여러 입력 채널을 관리할 수 있다. - 단일 스레드에서 입력 또는 쓰기 채널을 선택할 수 있다.

  • 구현이 간단하며, 사용하기 쉽다.

  • Java NIO 패키지보다 느리며, 복잡한 입출력 작업을 처리하기 어렵다.

Last updated