(자바) I/O(입력/출력) 및 NIO

무엇을 배울

기본 IO와 향상된 NIO의 차이점을 살펴보겠습니다.

요약하면 IO는 동기식이며 차단되는 반면 NIO는 비동기식이며 차단되지 않습니다!


자바와 IO

입/출력(I/O)은 네트워크 프로그래밍에서 가장 중요한 부분입니다!

I/O는 컴퓨터 시스템에서 데이터를 읽고 쓰는 것을 말합니다.

간단히 말해 시스템 간의 데이터 이동입니다.

I는 입력을 나타내고 O는 출력을 나타냅니다.

Java에서 in과 out의 방향성은 JVM을 기반으로 합니다!
즉, 내가 작성한 프로그램을 기준으로 다른 프로그램으로 보낼 데이터를 출력(쓰기 형식)하고, 다른 프로그램에서 가져올 데이터를 입력(읽기 형식)!

Java는 java.io 패키지에서 이 기능을 제공합니다.

JDK1.4부터 더 빠른 I/O를 처리하기 위해 NIO(New I/O)가 추가되었습니다.

– java.nio 패키지

NIO2도 JDK 7에 추가되었습니다.


java.io

java.io 패키지는 “바이트” 기반 데이터 작업을 위해 Stream이라는 클래스를 제공합니다.

읽기는 InputStream을 통해 이루어지고 쓰기는 OutputStream을 통해 이루어집니다.

파일에 바이트 대신 “char” 기반 문자열만 포함된 경우 Reader 또는 Writer를 사용할 수 있습니다.

참고로 InputStream과 OutputStream은 추상 클래스이므로 하위 클래스(예: FileInputStream)를 사용해야 합니다.

반품 InputStream 및 OutputStream 개체가 생성된 후 할당된 리소스를 해제하려면 close() 메서드를 호출해야 합니다!
이때,
InputStream과 OutputStream은 Closeable을 구현하기 때문에”“try-with-resources” 구문을 사용하여 할당하는 것이 좋습니다.

public abstract class InputStream extends Object implements Closeable {
    // ...
}

public abstract class OutputStream extends Object implements Closeable, Flushable {
    // ...
}

그렇다면 IO와 NIO의 차이점은 무엇입니까?

이것이 작업이 수행되는 방식입니다.

Stream이라는 단어에서 알 수 있듯이 IO는 연속 데이터를 의미합니다.

NIO는 스트림이 아닌 버퍼와 채널을 기반으로 데이터를 처리합니다.

차이점

그렇다면 둘의 가장 큰 차이점은 무엇일까요?

IO의 특징은 다음과 같습니다.

  • Stream 클래스 기반 동기화 및 차단

동기 부여: I/O 작업은 호출 스레드에서 직접 수행되며 작업이 완료될 때까지 다음 코드 조각이 수행되지 않습니다.

차단하다: I/O 작업이 완료될 때까지 다음 코드 조각을 계속 실행하지 마십시오. I/O 작업이 완료될 때까지 스레드가 차단됩니다.

NIO의 특징은 다음과 같습니다.

  • Buffer 클래스로 I/O 속도 향상
  • 논블로킹 채널 클래스 기반
  • 선택기 클래스 비동기

비동기: I/O 작업이 완료될 때까지 스레드가 차단되지 않습니다.

대신 CompletionHandler 인터페이스를 구현하는 개체를 등록하여 결과를 처리합니다.

즉, I/O 작업은 호출 스레드에서 직접 처리되지 않고 다른 스레드에서 비동기적으로 처리됩니다.

이 때 비동기 I/O가 수행됩니다.

Selector 클래스는 여러 채널을 수집하고 동시에 관찰하며 발생하는 이벤트를 처리하는 기능을 제공합니다.

비차단: I/O 연산이 완료되지 않아도 다음 코드로 진행합니다.

I/O 작업이 완료되면 결과를 처리하기 위해 콜백 함수가 호출됩니다.


인용하다.

갓 오브 자바 vol.2, 로드북

자바 네트워크 프로그래밍, JPub