자바 입출력
Last updated
Last updated
자바에서 파일을 읽고 조작하고 쓰기를 하는 작업을 할 떄, 소겟을 통해 데이터를 받고 보낼때 등 입출력에대한 작업을 할 떄 IO 패키지, NIO 패키지를 사용하게 되는데 자바 7 이상 버전에서 추가된 NIO 패키지를 사용하여 비동기 IO를 구현할 수 있습니다.
자바 NIO와 IO의 차이점은 다음과 같습니다
Stream 기반
한번에 하나 이상의 바이트를 읽어온다
어디에서 캐시되지 않는다.
읽어온 테이터는 앞뒤로 이동을 못한다.
input stream -> output stream
Channel/Buffer 기반
Channel은 Stream과 같은것으로 데이터 전송을 위한 데이터 소스와 Java 프로그램 간의 연결을 의미한다.
데이터를 나중에 처리하기위해 Buffer로 읽어 온다.
필요에 따라 앞뒤로 이동할 수 있다.
버퍼를 완전히 처리하기 위해 필요한 모든 데이터가 버퍼에 포함되어 있는지 확인 해야 한다
버퍼로 더 많은 데이터를 읽을 때 아직 처리하지 않은 버퍼의 데이터를 덮어쓰지 않도록 해야 한다.
객체에 직접 데이터를 쓰고 객체에서 직접 데이터를 읽는다.
모든 데이터는 버퍼로 처리되므로 데이터를 읽을 때 버퍼로에서 읽고 데이터가 기록되면 버퍼에 기한다. 즉, NIO의 데이터에 액세스할 때마다 버퍼에 있는 데이터를 사용한다.
Blocking IO - 스레드가 read()/write()를 호출하여 읽을 수 있는 데이터가 있거나 완전히 기록될 때까지 차단 된다.
Non Blocking IO - 반환하기 전에 데이터를 읽거나 쓸 때까지 기다리지 않습니다. - 스레드는 계속해서 다른 작업을 수행될 수 있다.
Selectors - 단일 스레드에서 여러 입력 채널을 관리할 수 있다. - 단일 스레드에서 입력 또는 쓰기 채널을 선택할 수 있다.
구현이 간단하며, 사용하기 쉽다.
Java NIO 패키지보다 느리며, 복잡한 입출력 작업을 처리하기 어렵다.