Java NIO パッケージの紹介

Mehvish Ashiq 2024年2月15日
  1. Java NIO パッケージの概要
  2. Java で NIO パッケージを使用してファイルの読み取りと書き込みを行う
Java NIO パッケージの紹介

このチュートリアルでは、Java NIO パッケージを紹介します。読み取り/書き込み操作を実行するための java.io パッケージはすでにありますが、java.nio を使用すると、追加の機能を別の方法で操作できます。

どのように?その詳細を詳しく見ていきましょう。

Java NIO パッケージの概要

Java New Input/Output(NIO)は、高性能のファイル処理構造とネットワーキング API です。java.nio パッケージには、すべての NIO クラスが含まれています。java.io パッケージのストリームベースの入出力(IO)クラスを置き換えるものではありません。

JDK 4 バージョンから導入された Java NIO は、java.io の代替として機能し、標準の入出力(IO)とは異なる入出力(IO)で動作するいくつかの追加機能を備えています。IO)。

java.io パッケージには、Java I/O 操作に使用できるすべての必要なクラスが含まれていることはすでにわかっていますが、java.nio には、JavaNIOAPI 全体で使用できる buffer クラスが導入されています。。

質問があるかもしれません。すでにパッケージ java.io がある場合、java.nio という名前の新しいパッケージを導入する理由は何ですか?

JavaNIO パッケージを使用する主な理由

2つの理由から、java.nio パッケージを使用することをお勧めします。

  1. java.nio パッケージは、バッファ内を前後に移動できるバッファ指向のアプローチを使用しています。メモリのブロック(バッファとも呼ばれます)を使用してデータを読み取り、キャッシュします。データは、必要に応じてバッファからすばやくアクセスされます。バッファにデータを書き込むこともできます。

  2. java.nio パッケージは、ノンブロッキング入出力(IO)操作を実行できます。ここで、非ブロッキングとは、準備ができていると判断したデータ/情報を読み取ることができることを意味します。

    たとえば、バッファからデータ/情報を読み取るようにチャネルに要求するスレッドがあります。スレッドはその時間枠内で他の操作に進み、作業を終了したところから再び続行します。その間に、読み取りプロセスが完了し、全体的なパフォーマンスが向上します。

NIOIO の主な違いは、IO がブロックしているのに対し、NIO は非ブロックであるということです。

バッファ指向のアプローチと高速入出力操作を探しているときはいつでも、IO パッケージよりも JavaNIO の使用を優先することができます。

ノート
JavaNIO パッケージを最大限に活用するには、JavaIO パッケージを理解する必要があります。

JavaNIO パッケージの主要コンポーネント

正しく動作するために、次の主要なコンポーネントがあります。

  1. Buffer - java.nio パッケージはバッファ指向であるため、プリミティブデータ型用のバッファがあります。バッファは、チャネルを使用してさらに処理するためにバッファとの間でデータを読み取ることができるコンテナとして使用されます。

  2. Channel - java.nio のチャネルクラスは、双方向通信に使用されるストリーム(IO ストリーム)に似ています。チャネルを使用することで、非ブロッキング入出力操作を実行できます。また、チャネルとの間でデータの読み取り/書き込みを行うこともできます。

    チャネルは、さまざまなエンティティへの接続が非ブロッキング IO 操作を実行できるチャネルによって記述されるゲートウェイとして使用されます。

  3. Selector - 非ブロッキング IO 操作を実行するためにセレクターを使用できます。セレクター(オブジェクト)は、イベントについて複数のチャネルを監視します。

    セレクターは、入出力操作を実行する準備ができているチャネルを選択すると言えます。

Java で NIO パッケージを使用してファイルの読み取りと書き込みを行う

以下は、さまざまな操作を実行するために使用できるさまざまなクラスのグラフィック表現です。

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 パッケージの概要-出力

指定されたファイルからデータを読み取り、最初のコードスニペットのコマンドラインに出力します。2 番目のコード例では、指定されたファイルにデータ(小さな文字列)を書き込み、それを画面に出力して、ファイルに何が書き込まれているかを示します。

最初のサンプルコードでは、Paths.get() メソッドを Path インスタンスのファクトリメソッドと呼びます。簡単に言うと、java.nio.file.Paths クラスの get() という名前の静的メソッドを呼び出すたびに、Path インスタンスが作成されると言えます。

このメソッドは、文字列のシーケンス(これらの文字列はパスを作成するために結合されます)または文字列をパラメーターとして受け取り、それを Path インスタンスに変換します。渡す文字列に不正な文字が含まれている場合は、InvalidPathException がスローされます。

ファイルと同様に、java.nio.file.Path はファイルシステム内の相対パスまたは絶対パスのいずれかを参照できます。

Charset は文字エンコードに使用されます。ISO-8859-1 文字エンコードを使用していますが、UTF-8 またはその他の使用したいものを指定できます。

readAllLines() メソッドは、テキストファイルを 1 行ずつ読み取ります。読み取ったデータを文字列リストに保存します(コードを参照)。

さらに、for ループを使用して、すべての読み取り行を画面に表示します。

2 番目のコード例では、このコード行を除いてすべてのロジックが同じです。

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

File.write() は、指定されたファイルへの書き込みに使用される JavaNIO パッケージの静的メソッドです。

著者: Mehvish Ashiq
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