# 자바 입출력

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

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

<figure><img src="https://1889142648-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVfLaXPTe0t3ptNpFbmH5%2Fuploads%2FNq521cd51c77jIllWObo%2F%EC%9E%90%EB%B0%94nio.jpg?alt=media&#x26;token=1685c5b1-05b8-4e04-9d72-28f04508a2ae" alt=""><figcaption><p>자바 IO와 NIO의 차이점 </p></figcaption></figure>

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