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
には、JavaNIO
API 全体で使用できる buffer
クラスが導入されています。。
質問があるかもしれません。すでにパッケージ java.io
がある場合、java.nio
という名前の新しいパッケージを導入する理由は何ですか?
JavaNIO
パッケージを使用する主な理由
2つの理由から、java.nio
パッケージを使用することをお勧めします。
-
java.nio
パッケージは、バッファ内を前後に移動できるバッファ指向のアプローチを使用しています。メモリのブロック(バッファとも呼ばれます)を使用してデータを読み取り、キャッシュします。データは、必要に応じてバッファからすばやくアクセスされます。バッファにデータを書き込むこともできます。 -
java.nio
パッケージは、ノンブロッキング入出力(IO
)操作を実行できます。ここで、非ブロッキングとは、準備ができていると判断したデータ/情報を読み取ることができることを意味します。たとえば、バッファからデータ/情報を読み取るようにチャネルに要求するスレッドがあります。スレッドはその時間枠内で他の操作に進み、作業を終了したところから再び続行します。その間に、読み取りプロセスが完了し、全体的なパフォーマンスが向上します。
NIO
と IO
の主な違いは、IO
がブロックしているのに対し、NIO
は非ブロックであるということです。
バッファ指向のアプローチと高速入出力操作を探しているときはいつでも、IO
パッケージよりも JavaNIO
の使用を優先することができます。
NIO
パッケージを最大限に活用するには、JavaIO
パッケージを理解する必要があります。JavaNIO
パッケージの主要コンポーネント
正しく動作するために、次の主要なコンポーネントがあります。
-
Buffer
-java.nio
パッケージはバッファ指向であるため、プリミティブデータ型用のバッファがあります。バッファは、チャネルを使用してさらに処理するためにバッファとの間でデータを読み取ることができるコンテナとして使用されます。 -
Channel
-java.nio
のチャネルクラスは、双方向通信に使用されるストリーム(IO
ストリーム)に似ています。チャネルを使用することで、非ブロッキング入出力操作を実行できます。また、チャネルとの間でデータの読み取り/書き込みを行うこともできます。チャネルは、さまざまなエンティティへの接続が非ブロッキング
IO
操作を実行できるチャネルによって記述されるゲートウェイとして使用されます。 -
Selector
- 非ブロッキングIO
操作を実行するためにセレクターを使用できます。セレクター(オブジェクト)は、イベントについて複数のチャネルを監視します。セレクターは、入出力操作を実行する準備ができているチャネルを選択すると言えます。
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);
}
}
}
出力(ファイルからの読み取りとファイルへの書き込み):
指定されたファイルからデータを読み取り、最初のコードスニペットのコマンドラインに出力します。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
パッケージの静的メソッドです。