자바 : NIO와 NIO.2의 차이점은 정확히 무엇입니까?


85

서로 얼마나 다른지 잘 모르기 때문에이 두 패키지에 대해 몇 가지 질문이 있습니다.

Google에서 조금 살펴본 결과 Oracle 은 JDK7 릴리스의 일부로 NIO새롭고 향상된 NIO.2패키지로 패키지 를 업데이트하기로 결정한 것 같습니다 .

  1. NIO패키지 의 성능은 패키지와 어떻게 비교 NIO.2됩니까?
  2. 에서 NIO로의 큰 변화는 무엇입니까 NIO.2? (예 : 새로운 방법, 기능)
  3. 원래 NIO패키지를 업데이트해야하는 이유는 무엇 입니까?
  4. NIO.2그냥 동의어 NIO요즘 패키지?

내 코드에서 레거시 패키지를 사용하고 싶은 것이 아니라 이것에 대해 정말 궁금합니다. 차이점을 알려주세요.


2
NIO2는 비동기 I / O와 java.nio.files 패키지를 도입했습니다.
user207421 2014-08-27

그게 다야? NIO.2가 엄청났다는 인상을 받았습니다.
John Huynh

1
처음에는 IO가있었습니다. 그런 다음 "New IO"를 도입했습니다. 그런 다음 더 많은 기능을 도입하기를 원했기 때문에 "New IO 2"라는 이름을지었습니다.
Kayaman 2014-08-27

1
고마워요. 그렇다면 "New IO 2"가 모든면에서 다른 두 가지보다 우수하다는 의미입니까? 저는 "The Java Tutorial"책을 읽고 있으며 NIO.2에 대해 가르치지 만 IO에 대한 섹션도 있습니다.
John Huynh

1
@JohnHuynh 아니요, 새로운 기능을 도입했음을 의미합니다. 필요하지 않으면 사용하지 마십시오.
user207421 2015 년

답변:


86

Java는 처음에 파일 시스템에 액세스하기 File위해 java.io패키지 에서 클래스 를 제공함으로써 시작되었습니다 . 이 개체는 파일 / 디렉터리를 나타내며 파일 / 디렉터리가 있는지 확인하고 속성을 가져 와서 삭제하는 등의 일부 작업을 수행 할 수 있습니다. 하지만 몇 가지 단점이있었습니다. 몇 가지를 예로 들면 :

  • File 클래스에는 복사 방법과 같은 몇 가지 중요한 기능이 없습니다.
  • 또한 boolean. 상상할 수 있듯이 오류가 발생 false하면 예외가 발생하지 않고 반환되었습니다. 개발자는 실제로 실패한 이유를 알 방법이 없었습니다.
  • 심볼릭 링크 지원에 대한 적절한 처리를 제공하지 않았습니다.
  • 제한된 파일 속성 세트가 제공되었습니다.

이러한 문제를 극복하기 위해 java.nio 패키지가 java 4에 도입되었습니다. 주요 기능은 다음과 같습니다.

  • 채널 및 선택기 : 채널은 메모리 매핑 파일과 같은 하위 수준 파일 시스템 기능에 대한 추상화입니다.
  • 버퍼 : 모든 기본 클래스에 대한 버퍼링 (부울 제외).
  • 문자셋 : 문자셋 (java.nio.charset), 인코더 및 디코더를 사용하여 바이트 및 유니 코드 기호 매핑

java 7에서는 java.nio.file 패키지가 도입되어 심볼릭 링크, 파일 속성 액세스를 처리하는 데 더 나은 지원을 제공하고 특히 Path, Paths 및 Files와 같은 클래스를 통해 확장 된 파일 시스템을 지원합니다. 이에 대한 자세한 내용 은 java.nio.file 패키지 설명 을 참조하십시오.

이를 염두에두고 :

NIO에서 NIO.2 로의 큰 변화는 무엇입니까? (예 : 새로운 방법, 기능)?

그들은 다른 목적으로 사용됩니다. 큰 변경 사항을 지적하기 위해 완전히 새로운 패키지를 살펴볼 수 있습니다 java.nio.file.

원래 NIO 패키지를 업데이트해야하는 이유는 무엇입니까?

그렇지 않았습니다. 업데이트가 아닌 새로운 패키지가 도입되었습니다.

NIO.2는 요즘 NIO 패키지와 동의어일까요? NIO 패키지의 성능은 NIO.2 패키지와 어떻게 비교됩니까?

아니요, 동의어가 아닙니다. 또한 서로 다른 용도로 사용되기 때문에 성능을 비교하는 것도 의미가 없습니다. NIO는 좀 더 추상적 인 저수준 데이터 I / O이고 NIO2는 파일 관리에 중점을 둡니다.

도움이 되었기를 바랍니다.

[참고 문헌 : Oracle Certified Professional Java SE7-포괄적 인 OCJP7 인증 가이드, SGGanesh 및 Tushar Sharma-9 장]


56

NIO.2는 비동기식 I / O를 도입했습니다 .

비동기 I / O는 NIO에서 지원하지 않는 비 블로킹 I / O에 대한 접근 방식입니다.

NIO : 선택기 / 반응기 패턴

NIO.2 : 완료 핸들러 / 프로 액터 패턴

따라서 Windows에서 NIO.2는 I / O 완료 포트를 사용하므로 성능이 향상됩니다. 예외는 아무도 모르기 때문입니다. 서버 측에서 Windows를 사용하는 사람이 아무도 없기 때문이며, 사용하는 경우 .net에 막대한 투자를했기 때문에 그렇게 할 가능성이 높기 때문에 Java 사용을 고려하지 않을 가능성이 큽니다.


3
결코 말하지 마십시오. 특히 예상되는 작업 부하가 그렇게 높지 않을 때 사용중인 Windows 기반 서버가 많이 있습니다.
Jonathan Rosenne 2017

proactor 대 원자로는 내가 가장 주목 무엇인가
Lefteris Eleftheriades

1
선도적 인 금융 기관인 우리 회사에는 많은 Windows 서버가 있으며 주로 Java를 사용합니다.
Janac Meena

9

내 테이크 :

짧은 버전

높은 수준의 훨씬 향상된 파일 및 파일 시스템 기능을 갖춘 java.nio.file 패키지가 추가되었습니다.
네트워크 소켓 또는 낮은 수준의 파일 액세스 관점에서 NIO == NIO.2와 몇 가지 편의 개선 사항이 있습니다.

더 긴 버전

자바 IO

패키지 : java.io
이전 차단 I / O API

자바 NIO

새로운 비 차단 API 인 Java 1.4에 추가되었습니다.
패키지 : java.nio
Java non-blocking IO. 수업은 좋아 Selector, SelectorKey, Channel.
NIO는 I / O가 (네트워크를위한 큰 걸음을했다 나에게 보인다 Selector, SelectorKey, SocketChannel, ServerSocketChannel, Buffer), 훨씬 적은 파일에 대한 I / O를 ( FileChannelBuffer단지를 포함하여 메모리 매핑 된 파일). 이것은 네트워크 및 파일 부분 모두에 대해 상당히 낮은 수준의 API입니다.

자바 NIO.2

Java 7에 추가되었습니다. 주로 훨씬 향상된 파일 및 파일 시스템 조작과 주소 지정 API를 추가하는 것입니다. 새로운 파일 및 파일 시스템 관련 API는 상대적으로 높은 수준입니다.

패키지 : java.nio.file부모에 대한 몇 가지 추가 사항 java.nio.
이 추가 사항은 파일 I / O 용이며 네트워크 I / O 또는 하위 수준 파일 API에 대한 몇 가지 사소한 추가 사항입니다.

가장 주목할만한 하위 수준의 파일 관련 필요하지 않은 API 추가는 AsynchronousSocketChannel, AsynchronousServerSocketChannel및이며 AsynchronousFileChannel, 일부 메서드에 콜백 변형을 추가합니다. 의 비동기 버전은 주로 편리하게 추가되었습니다. 이러한 매핑 인터페이스는 이전에도 함께 해킹되었을 수 있었지만 이제는 JRE에서 즉시 사용할 수 있습니다.

새로운 파일 API는 경로로 훨씬 더 유용한 파일 시스템 주소 지정, 사용자 정의 파일 시스템 공급자를 사용한 훨씬 향상된 ZIP 파일 조작, 특수 파일 속성 액세스, 하나의 명령으로 전체 파일 읽기, 하나의 명령 등. 그러나 모든 파일 / 파일 시스템과 관련이 있으며 모두 상당히 높은 수준입니다.

네트워크 소켓 또는 저수준 파일 액세스의 관점에서 위에서 이미 말한 것을 반복합니다. NIO == NIO.2

관련 링크

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.