비차단 I/O(Java)
Non-blocking I/O (Java)Java.nio(NIO는 비차단 I/O를[1] 의미한다)는 집중적인 I/O 작업을 위한 기능을 제공하는 Java 프로그래밍 언어 API 모음입니다.기존의 표준 I/O를 보완하기 위해 Sun Microsystems가 J2SE 1.4 Java 릴리즈와 함께 도입했다.NIO는 자바 커뮤니티 프로세스에 따라 JSR 51로 개발되었다.[2]NIO.2라고 불리는 새로운 파일 시스템 API를 제공하는 NIO에 대한 확장이 Java SE 7("돌핀")[3]과 함께 출시되었다.
특징 및 구성
NIO의 API는 현대 운영 체제의 낮은 수준의 I/O 운영에 대한 액세스를 제공하도록 설계되었다.API 자체는 비교적 높은 수준이지만, 기본 플랫폼의 가장 효율적인 운영을 직접 사용할 수 있는 구현을 촉진하는 것이 목적이다.
Java NIO API는 에서 제공된다.java.nio
포장 및 그 하위 패키지Oracle의 설명서는 이러한 기능을 식별한다.
- 원시 유형의 데이터 버퍼
- 문자 집합 인코더 및 디코더
- Perl 스타일의 정규식을 기반으로 한 패턴 매칭 기능(패키지 내)
java.util.regex
) - 채널, 새로운 원시 I/O 추상화
- 최대 파일 잠금 및 메모리 매핑을 지원하는 파일 인터페이스
Integer.MAX_VALUE
바이트(2GiB) - 확장 가능한 서버를 쓰기 위한 다중화된 비차단 I/O 기능
NIO 버퍼
NIO 데이터 전송은 버퍼(buffer)를 기반으로 한다.java.nio.Buffer
및 관련 클래스).이러한 클래스는 적은 수의 데이터 전송 작업과 함께 연속적인 메모리 범위를 나타낸다.이론적으로 이것들은 범용 데이터 구조지만, 구현은 Java에서는 달리 접근할 수 없는 정렬 또는 페이징 특성을 위한 메모리를 선택할 수 있다.일반적으로 이것은 버퍼 콘텐츠가 기본 I/O 운영에 기본 운영 체제에서 사용하는 동일한 물리적 메모리를 점유하여 가장 직접적인 전송 메커니즘을 허용하고 추가 복사가 필요하지 않게 하는 데 사용된다.대부분의 운영 체제에서는 메모리의 특정 영역에 올바른 속성이 있는 경우 CPU를 전혀 사용하지 않고도 전송을 수행할 수 있다.NIO 버퍼는 이러한 목표를 지원하기 위해 의도적으로 기능이 제한된다.
Java의 모든 원시 유형에 대한 버퍼 클래스가 있다.boolean
바이트 버퍼와 메모리를 공유할 수 있고 기본 바이트의 임의 해석을 허용한다.
사용법
NIO 버퍼는 접근자 메서드의 기능을 지시하는 몇 개의 포인터를 유지한다.NIO 버퍼 구현에는 다음과 같은 포인터를 수정하는 다양한 방법이 포함되어 있다.
- 그
flip()
메소드는 표준적인 의미에서 "paging" 또는 paging 기능을 수행하는 대신, 위치 포인터를 기본 배열의 원점(있는 경우)으로, 한계 포인터를 위치 포인터의 이전 위치로 이동시킨다. - 셋
get()
NIO 버퍼에서 데이터를 전송하는 방법이 제공된다.대량 구현은 전통적인 의미에서 "get"을 수행하는 것이 아니라, 데이터를 지정된 배열로 "put"한다.이 방법에 제공된 "오프셋" 인수는 읽을 버퍼 내의 오프셋이나 위치 포인터에서의 오프셋이 아니라 대상 배열 내에서 0의 오프셋을 가리킨다. - 절대값을 사용하지 않는 한
get()
그리고put()
방법, 임의의get()
또는put()
위치 포인터로부터 수행된다.쓰기 위치를 조정하지 않고 기본 배열의 다른 위치에서 읽어야 하는 경우mark()
그리고reset()
방법이 제공되었다. - 그
mark()
메소드는 마크 포인터를 위치 포인터 위치로 설정하여 위치 포인터 위치를 효과적으로 저장한다.그reset()
메소드는 위치 포인터가 마크 포인터 위치로 이동하게 한다. - ...의 호출에 따라.
clear()
방법 또는 방법flip()
표시 포인터를 폐기하는 방법. - 그
clear()
메소드는 버퍼의 영점을 보장하지는 않지만, 한계 포인터를 기본 배열의 위쪽 경계로 되돌리고 위치 포인터를 0으로 되돌린다. put()
그리고get()
NIO 버퍼에 대한 작업은 스레드가 안전하지 않다.- 오직 너만이 할 수 있다.
map()
ajava.nio.MappedByteBuffer
a로부터java.nio.channels.FileChannel
까지Integer.MAX_VALUE
크기(2GiB), 이 한계를 초과하는 영역은 0보다 큰 오프셋을 사용하여 액세스할 수 있다.
채널
채널(인터페이스 구현 클래스)java.nio.channels.Channel
)은 NIO 버퍼와 대량 데이터 전송을 제공하도록 설계되었다.이는 상위 레벨 I/O 라이브러리(패키지)의 클래스와 병렬로 존재하는 낮은 레벨의 데이터 전송 메커니즘이다.java.io
그리고java.net
) 채널 구현은 다음과 같은 높은 수준의 데이터 전송 클래스에서 얻을 수 있다.java.io.File
,java.net.ServerSocket
또는java.net.Socket
그리고 역도 성립.채널은 유닉스 유사 운영 체제에서 발견되는 "파일 설명자"와 유사하다.
파일 채널(java.nio.channels.FileChannel
)는 임의의 버퍼도 사용할 수 있지만 메모리 저장 파일을 사용하여 파일 내용에 직접 매핑된 버퍼를 설정할 수도 있다.그들은 또한 파일 시스템 잠금과 상호작용할 수 있다.마찬가지로 소켓 채널(java.nio.channels.SocketChannel
그리고java.nio.channels.ServerSocketChannel
) 소켓과 NIO 버퍼 간의 데이터 전송 허용.
FileChannel
파일 복사를 위해 사용될 수 있다. 이것은 바이트 배열로 오래된 읽기/쓰기를 사용하는 것보다 잠재적으로 훨씬 더 효율적이다.이에 대한 일반적인 코드는 다음과 같다.
// 파일 채널 가져오기 해보다(파일채널 에 = 파일채널.개방된(출처, StandardOpenOption.읽다); 파일채널 밖으로 = 파일채널.개방된(표적으로 삼다, StandardOpenOption.쓰기)) { // JavaVM은 기본 I/O 작업으로서 이 작업을 수행하기 위해 최선을 다한다. 에.전근시키다에게(0, 에.사이즈를 맞추다(), 밖으로); }
선택기
선택기(A selector)java.nio.channels.Selector
및 하위 클래스)는 채널에서 대기하고 하나 이상의 데이터 전송이 가능한 시기를 인식할 수 있는 메커니즘을 제공한다.셀렉터에 다수의 채널을 등록하면 적어도 하나의 채널을 사용할 준비가 될 때까지 또는 중단 조건이 발생할 때까지 프로그램 흐름을 차단할 수 있다.
이러한 멀티플렉싱 동작은 스레드로 구현될 수 있지만, 선택기는 하위 수준의 운영 체제 구조를 사용하여 훨씬 더 효율적인 구현을 제공할 수 있다.예를 들어, POSIX 호환 운영 체제는 이러한 개념을 직접 표현할 수 있을 것이다. ()를 선택한다.이 설계의 주목할 만한 적용은 다수의 세션에서 동시에 응답을 기다리는 서버 소프트웨어의 공통 패러다임일 것이다.
문자 집합
자바에서 문자 집합은 유니코드 문자(또는 그 하위 집합)와 바이트 사이의 매핑이다.그java.nio.charset
NIO 패키지는 문자 집합을 식별하고 새로운 매핑을 위한 인코딩 및 디코딩 알고리즘을 제공하는 기능을 제공한다.
리셉션
Java IO RandomAccess 파일과 연결된 Channel이 인터럽트에서 파일 설명자를 닫는 반면 RandomAccessFiles 자체 읽기 방법은 이 작업을 수행하지 않는 것은 예기치 않은 일이다.[4]
JDK 7 및 NIO.2
![]() |
JDK 7에는 다음이 포함된다.java.nio.file
이 패키지와 함께Path
클래스(JDK 7의 새로운 기능도 포함)는 파일 시스템 작업에 확장된 기능을 제공한다. 예를 들어 심볼/하드 링크와 함께 작업할 수 있고 이전 파일 클래스보다 더 빠르게 버퍼에 빅 디렉토리 목록을 덤프할 수 있다.그java.nio.file
패키지 및 관련 패키지,java.nio.file.attribute
, 파일 I/O 및 파일 시스템 액세스에 대한 포괄적인 지원 제공.zip 파일 시스템 공급자는 JDK 7에서도 이용할 수 있다.
참조
- ^ "Enhancements in Java I/O". Oracle Java Documentation. Retrieved 8 June 2017.
- ^ "JSR 51: New I/O APIs for the JavaTM Platform". The Java Community Process(SM) Program - JSRs: Java Specification Requests. Retrieved 2009-05-23.
- ^ "이 JSR은 자바 SE 7 "돌핀"의 일부로 전달될 것이다.
- ^ 2010-05-14년 게릿(소프트웨어)의 저자 숀 피어스, 베스트를 안다고 가정하지 마십시오.
외부 링크
- Java SE 10 API Javadocs
- JDK 5.0 새로운 I/O 관련 API & Developer 가이드 - Oracle Corporation의 새로운 I/O 설명
- Java SE 7 NIO 2 기능 알아보기
- JSR 51(NIO)
- JSR 203(NIO.2)
- 확장성이 뛰어난 NIO 기반 서버의 아키텍처 - Java NIO 및 사용 패턴에 대한 논의
- Java NIO 자습서
- Rox Java NIO 자습서
- Java에서 확장 가능한 IO(PDF)