Javaでは従来ファイルの入出力処理などで「java.io」パッケージのクラスを利用し、プログラム開発が行われていました。
しかし「java.io」パッケージには様々な問題が隠れていることも揶揄されており、新たなI/O処理用のパッケージとして「java.nio」パッケージが導入されています。
本記事では、「java.nio」パッケージの基本情報と簡単なサンプルコードを掲載しながらご紹介していきます。
Javaのnioとは
Javaのnioは、J2SE 1.4のリリース時にSun Microsystems社から標準I/Oを補完する形でリリースされたパッケージです。
nioは、New I/O APIの略称であり、既存のI/O処理を改善してより効率的に利用出来るように拡張されたパッケージです。
記事執筆時点(2020年12月)では、Java1.7で導入されたnio2と呼ばれるバージョンが主に利用されています。
java.ioとjava.nioの違いとは
従来から利用されているjava.ioとjava.nioの違いについても簡単にご紹介しておきます。
java.io
「java.io」は、様々な入出力クラスが提供されているパッケージです。
FileクラスやFileInputStreamクラスなどが代表的で、ファイル入出力関連のクラスが豊富に提供されています。
バイトストリームや文字列ストリームを使用するなど、ストリーム処理を中心としてI/O処理が実現可能でした。
java.nio
「java.nio」では、基本的な標準I/O処理を補完した形で、より高機能な処理を実現出来るよう改善されたパッケージです。
従来のストリーム処理ではなく、buffers(バッファ)やchannels(チャンネル)といった概念でI/O処理を実現することが出来るよう改善されています。
基本的には「java.nio」が上位互換となっているため、特段の理由が無い限りJava7以降では「java.nio」を利用することが推奨されます。
java.nioパッケージを使ってみよう
では実際にjava.nioパッケージを利用して、ファイルの読み込みと書き込み処理を実装してみましょう。
ファイルの読み込み
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; public class Main { public static void main(String[] args) { Path path = Paths.get("sample.txt"); try { List<String> lineList = Files.readAllLines(path); for (String line : lineList) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } }
サンプルでは指定したパスのファイルを全行読み込み、読み込んだ内容をコンソールに1行ずつ表示するサンプルです。
Paths.getメソッド
9行目で実行しているPaths.getメソッドでは、1つ以上の文字列を指定することで、連結された最終的な文字列をPathオブジェクトに変換することが出来ます。
今回のサンプルでは、実行環境に格納した「sample.txt」ファイルを示す文字列をPathオブジェクトとして変換し、インスタンス名「path」に格納しています。
Files.readAllLinesメソッド
12行目のFiles.readAllLinesメソッドでは、Pathオブジェクトを引数に指定することでテキストファイルを開き、ファイルの全行を読み込んだのち文字列型のリスト形式で返却することが出来ます。
サンプルでは省略していますが、第2引数として文字コードを指定することも可能です。
ファイルの書き込み
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { Path path = Paths.get("sample.txt"); List<String> list = new ArrayList<>(); list.add("1行目"); list.add("2行目"); list.add("3行目"); try { Files.write(path, list, StandardOpenOption.APPEND); List<String> lineList = Files.readAllLines(path); for (String line : lineList) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } }
サンプルでは指定したファイルに、リストに格納した文字列を追記し、ファイルに記述された内容を1行ずつコンソールに表示しています。
Files.writeメソッド
13行目のPaths.getメソッドは、上述したファイル読み込みと同じで、今回は書き込み対象のファイルとしてPathオブジェクトを生成しておきます。
20行目が実際の書き込み処理で、第1引数に指定したPathオブジェクトのファイルに対して、第2引数のリストに設定された内容を、第3引数で指定した書き込み方法で記述します。
今回は第3引数に「StandardOpenOption.APPEND」を指定しており、ファイルへの追記を意味します。
さいごに: Javaのnioパッケージは新規開発では積極的に利用していくべき
本記事では、Javaのnioパッケージについての基本的な情報と使い方をサンプルコードに沿ってご紹介してきました。
Java7以降で利用可能なnioについては、基本的にioパッケージの機能は補完されていることからも、新規開発では積極的に利用していくべきと言えます。
ただ、既存のJava7以前のソースを全て置き換えなければならないわけではないため、あくまで新規開発を中心に利用し、必要なタイミングで従来のソースコードに見直しを掛けるのが良いかと思います。
ファイルに新規で書き込みを行いたい場合には、StandardOpenOption.TRUNCATE_EXISTINGが利用可能です。
ただし、既に記述されている内容は削除されてしまうため注意が必要です。
また、今回はあくまでサンプルとして簡単に作成しているため、パスに指定したファイルが存在しない場合エラーとなる点にもご注意ください。