Java NIO 패키지 소개

Mehvish Ashiq 2024년2월15일
  1. Java NIO 패키지 소개
  2. NIO 패키지를 사용하여 Java에서 파일 읽기 및 쓰기
Java NIO 패키지 소개

이 튜토리얼은 자바 NIO 패키지를 소개합니다. 읽기/쓰기 작업을 수행하기 위한 java.io 패키지가 이미 있지만 java.nio를 사용하면 추가 기능과 함께 다르게 작업할 수 있습니다.

어떻게? 자세한 내용을 살펴보겠습니다.

Java NIO 패키지 소개

Java New Input/Output(NIO)은 고성능 파일 처리 구조 및 네트워킹 API입니다. java.nio 패키지에는 모든 NIO 클래스가 있습니다. java.io 패키지의 스트림 기반 입/출력(IO) 클래스를 대체하지 않습니다.

Java NIOJDK 4 버전에서 도입되었으며 표준 입력/출력(IO).

java.io 패키지에는 Java I/O 작업에 사용할 수 있는 모든 필수 클래스가 포함되어 있으며 java.nio는 Java NIO API 전체에서 사용할 수 있는 buffer 클래스를 소개합니다. .

질문이 있을 수 있습니다. 이미 java.io 패키지가 있는데 java.nio라는 새 패키지를 도입하는 이유는 무엇입니까?

Java NIO 패키지를 사용하는 주요 이유

두 가지 이유로 java.nio 패키지를 선호합니다.

  1. java.nio 패키지는 버퍼에서 앞뒤로 이동할 수 있는 버퍼 지향 접근 방식을 사용합니다. 데이터를 읽고 캐시하기 위해 메모리 블록(버퍼라고도 함)을 사용하며 필요할 때마다 버퍼에서 빠르게 액세스합니다. 버퍼에 데이터를 쓸 수도 있습니다.

  2. java.nio 패키지는 비차단 입/출력(IO) 작업을 수행할 수 있습니다. 여기에서 비차단은 준비된 데이터/정보를 읽을 수 있음을 의미합니다.

    예를 들어, 채널에 버퍼에서 데이터/정보를 읽도록 요청하는 스레드가 있습니다. 스레드는 해당 시간 프레임에서 다른 작업을 수행하고 작업을 종료한 위치에서 다시 계속됩니다. 그 사이에 읽기 프로세스가 완료되고 전반적인 성능이 향상됩니다.

NIOIO의 주요 차이점은 NIO는 차단되지 않는 반면 IO는 차단된다는 것입니다.

버퍼 지향 접근 방식과 고속 입력/출력 작업을 찾을 때마다 IO 패키지보다 Java NIO 사용을 우선적으로 사용할 수 있습니다.

메모
Java NIO 패키지를 완벽하게 사용하려면 Java IO 패키지를 이해해야 합니다.

Java NIO 패키지의 주요 구성 요소

제대로 작동하려면 다음과 같은 주요 구성 요소가 있습니다.

  1. Buffer - java.nio 패키지는 버퍼 지향적이므로 기본 데이터 유형에 대한 버퍼가 있습니다. 버퍼는 채널을 사용하여 추가 처리를 위해 버퍼에서/로 데이터를 읽을 수 있는 컨테이너로 사용됩니다.

  2. Channel - java.nio의 채널 클래스는 양방향 통신에 사용되는 스트림(IO 스트림)과 유사합니다. 채널을 사용하여 비차단 입력/출력 작업을 수행할 수 있습니다. 또한 채널에서 버퍼로/로부터 데이터를 읽고 쓸 수 있습니다.

    채널은 다양한 엔터티에 대한 연결이 비차단 IO 작업을 수행할 수 있는 채널로 설명되는 게이트웨이로 사용됩니다.

  3. Selector - 비차단 IO 작업을 수행하기 위해 선택기를 사용할 수 있습니다. 선택기(객체)는 이벤트에 대해 둘 이상의 채널을 모니터링합니다.

    선택기는 입력/출력 작업을 수행할 준비가 된 채널을 선택한다고 말할 수 있습니다.

NIO 패키지를 사용하여 Java에서 파일 읽기 및 쓰기

다음은 다른 작업을 수행하는 데 사용할 수 있는 다양한 클래스의 그래픽 표현입니다.

Java nio 패키지 소개 - 클래스

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);
    }
  }
}

출력(파일에서 읽고 파일에 쓰기):

Java nio 패키지 소개 - 출력

지정된 파일에서 데이터를 읽고 첫 번째 코드 조각의 명령줄에 인쇄합니다. 두 번째 코드 예제에서는 데이터(작은 문자열)를 주어진 파일에 쓰고 화면에 인쇄하여 파일에 무엇을 쓰고 있는지 알려줍니다.

첫 번째 예제 코드에서 Paths.get() 메서드를 Path 인스턴스에 대한 팩토리 메서드라고 합니다. 간단히 말해서 java.nio.file.Paths 클래스의 get()이라는 정적 메소드를 호출할 때마다 Path 인스턴스를 생성한다고 말할 수 있습니다.

이 메서드는 문자열 시퀀스(이 문자열은 경로를 만들기 위해 결합됨) 또는 문자열을 매개변수로 사용하여 Path 인스턴스로 변환합니다. 전달한 문자열에 잘못된 문자가 있으면 InvalidPathException이 발생합니다.

File과 같이 java.nio.file.Path는 파일 시스템 내의 상대 또는 절대 경로를 참조할 수 있습니다.

Charset은 문자 인코딩에 사용됩니다. 우리는 ISO-8859-1 문자 인코딩을 사용하고 있지만 UTF-8 또는 사용하려는 다른 것을 지정할 수 있습니다.

readAllLines() 메서드는 텍스트 파일을 한 줄씩 읽습니다. 읽은 데이터를 StringList에 저장합니다(코드 참조).

또한 for 루프를 사용하여 모든 읽기 행을 화면에 표시합니다.

두 번째 코드 예제에서 이 코드 줄을 제외하고는 모든 논리가 동일합니다.

Files.write(filePath, message.getBytes());

File.write()는 지정된 파일에 쓰는 데 사용되는 Java NIO 패키지의 정적 메서드입니다.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook