Java NIO 패키지 소개
이 튜토리얼은 자바 NIO
패키지를 소개합니다. 읽기/쓰기 작업을 수행하기 위한 java.io
패키지가 이미 있지만 java.nio
를 사용하면 추가 기능과 함께 다르게 작업할 수 있습니다.
어떻게? 자세한 내용을 살펴보겠습니다.
Java NIO
패키지 소개
Java New Input/Output(NIO
)은 고성능 파일 처리 구조 및 네트워킹 API입니다. java.nio
패키지에는 모든 NIO
클래스가 있습니다. java.io
패키지의 스트림 기반 입/출력(IO
) 클래스를 대체하지 않습니다.
Java NIO
는 JDK 4
버전에서 도입되었으며 표준 입력/출력(IO
).
java.io
패키지에는 Java I/O 작업에 사용할 수 있는 모든 필수 클래스가 포함되어 있으며 java.nio
는 Java NIO
API 전체에서 사용할 수 있는 buffer
클래스를 소개합니다. .
질문이 있을 수 있습니다. 이미 java.io
패키지가 있는데 java.nio
라는 새 패키지를 도입하는 이유는 무엇입니까?
Java NIO
패키지를 사용하는 주요 이유
두 가지 이유로 java.nio
패키지를 선호합니다.
-
java.nio
패키지는 버퍼에서 앞뒤로 이동할 수 있는 버퍼 지향 접근 방식을 사용합니다. 데이터를 읽고 캐시하기 위해 메모리 블록(버퍼라고도 함)을 사용하며 필요할 때마다 버퍼에서 빠르게 액세스합니다. 버퍼에 데이터를 쓸 수도 있습니다. -
java.nio
패키지는 비차단 입/출력(IO
) 작업을 수행할 수 있습니다. 여기에서 비차단은 준비된 데이터/정보를 읽을 수 있음을 의미합니다.예를 들어, 채널에 버퍼에서 데이터/정보를 읽도록 요청하는 스레드가 있습니다. 스레드는 해당 시간 프레임에서 다른 작업을 수행하고 작업을 종료한 위치에서 다시 계속됩니다. 그 사이에 읽기 프로세스가 완료되고 전반적인 성능이 향상됩니다.
NIO
와 IO
의 주요 차이점은 NIO
는 차단되지 않는 반면 IO
는 차단된다는 것입니다.
버퍼 지향 접근 방식과 고속 입력/출력 작업을 찾을 때마다 IO
패키지보다 Java NIO
사용을 우선적으로 사용할 수 있습니다.
NIO
패키지를 완벽하게 사용하려면 Java IO
패키지를 이해해야 합니다.Java NIO
패키지의 주요 구성 요소
제대로 작동하려면 다음과 같은 주요 구성 요소가 있습니다.
-
Buffer
-java.nio
패키지는 버퍼 지향적이므로 기본 데이터 유형에 대한 버퍼가 있습니다. 버퍼는 채널을 사용하여 추가 처리를 위해 버퍼에서/로 데이터를 읽을 수 있는 컨테이너로 사용됩니다. -
Channel
-java.nio
의 채널 클래스는 양방향 통신에 사용되는 스트림(IO
스트림)과 유사합니다. 채널을 사용하여 비차단 입력/출력 작업을 수행할 수 있습니다. 또한 채널에서 버퍼로/로부터 데이터를 읽고 쓸 수 있습니다.채널은 다양한 엔터티에 대한 연결이 비차단
IO
작업을 수행할 수 있는 채널로 설명되는 게이트웨이로 사용됩니다. -
Selector
- 비차단IO
작업을 수행하기 위해 선택기를 사용할 수 있습니다. 선택기(객체)는 이벤트에 대해 둘 이상의 채널을 모니터링합니다.선택기는 입력/출력 작업을 수행할 준비가 된 채널을 선택한다고 말할 수 있습니다.
NIO
패키지를 사용하여 Java에서 파일 읽기 및 쓰기
다음은 다른 작업을 수행하는 데 사용할 수 있는 다양한 클래스의 그래픽 표현입니다.
java.nio
에 대한 자세한 내용은 여기에서 읽을 수 있지만 이 자습서에서는 파일에서 읽고 파일 관련 작업에 쓰는 데 중점을 둡니다. 다음 예를 참조하십시오.
예제 코드(파일에서 읽기용):
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class readFromFile {
public static void main(String[] args) {
Path filePath = Paths.get("file.txt");
Charset charSet = Charset.forName("ISO-8859-1");
try {
List<String> lines = Files.readAllLines(filePath, charSet);
for (String line : lines) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println(e);
}
}
}
예제 코드(파일에 쓰기용):
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class writeToFile {
public static void main(String[] args) {
Path filePath = Paths.get("file.txt");
String message = "We have overwritten the file";
Charset charSet = Charset.forName("ISO-8859-1");
try {
Files.write(filePath, message.getBytes());
List<String> lines = Files.readAllLines(filePath, charSet);
for (String line : lines) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println(e);
}
}
}
출력(파일에서 읽고 파일에 쓰기):
지정된 파일에서 데이터를 읽고 첫 번째 코드 조각의 명령줄에 인쇄합니다. 두 번째 코드 예제에서는 데이터(작은 문자열)를 주어진 파일에 쓰고 화면에 인쇄하여 파일에 무엇을 쓰고 있는지 알려줍니다.
첫 번째 예제 코드에서 Paths.get()
메서드를 Path
인스턴스에 대한 팩토리 메서드라고 합니다. 간단히 말해서 java.nio.file.Paths
클래스의 get()
이라는 정적 메소드를 호출할 때마다 Path
인스턴스를 생성한다고 말할 수 있습니다.
이 메서드는 문자열 시퀀스(이 문자열은 경로를 만들기 위해 결합됨) 또는 문자열을 매개변수로 사용하여 Path
인스턴스로 변환합니다. 전달한 문자열에 잘못된 문자가 있으면 InvalidPathException
이 발생합니다.
File
과 같이 java.nio.file.Path
는 파일 시스템 내의 상대 또는 절대 경로를 참조할 수 있습니다.
Charset
은 문자 인코딩에 사용됩니다. 우리는 ISO-8859-1
문자 인코딩을 사용하고 있지만 UTF-8
또는 사용하려는 다른 것을 지정할 수 있습니다.
readAllLines()
메서드는 텍스트 파일을 한 줄씩 읽습니다. 읽은 데이터를 String
의 List
에 저장합니다(코드 참조).
또한 for
루프를 사용하여 모든 읽기 행을 화면에 표시합니다.
두 번째 코드 예제에서 이 코드 줄을 제외하고는 모든 논리가 동일합니다.
Files.write(filePath, message.getBytes());
File.write()
는 지정된 파일에 쓰는 데 사용되는 Java NIO
패키지의 정적 메서드입니다.