入出力ストリームとは
ストリーム(stream)は「小さな川」という意味で、データの入出力の流れを表しています。
ファイルやネットワークからデータを受け取る入力ストリームとデータを書き出す出力ストリームがあります。java.ioパッケージには媒体の種類や入出力によって区分された4つの抽象スーパークラスがあります。バイナリデータを扱うのをバイトストリーム、テキストデータを扱うのを文字ストリームと呼びます。
入出力ストリームの種類
上記4つの入出力ストリームを基底クラスに持ち、メモリやファイルなど操作の対象応じたクラスが用意されています。(これが、入出力ストリームをややこしくしていますよね)
java.ioパッケージの主なクラスをまとめました。
概要 | 入力文字ストリーム | 出力文字ストリーム | 入力バイトストリーム | 出力バイトストリーム |
基底クラス | Reader | Writer | InputStream | OutputStream |
ファイルをストリームとして扱う | FileReader | FileWriter | FileInputStream | FileOutputStream |
配列をストリームとして扱う | CharArrayReader | CharArrayWriter | ByteArrayInputStream | ByteArrayOutputStream |
バッファイリングする | BufferedReader | BufferedWriter | BufferedInputStream | BufferedOutputStream |
パイプによる処理を行う | PipedReader | PipedWriter | PipedInputStream | PipedOutputStream |
メモリ内の文字列をストリームとして扱う | StringReader | StringWriter | ー | ー |
オブジェクトをストリームとして扱う | ー | ー | ObjectInputStream | ObjectOutputStream |
primitiveデータ型をストリームとして扱う | ー | ー | DataInputStream | DataOutputStream |
ストリーム基本操作
ストリームを扱う際は、必ずストリームのオープンとストリームのクローズをおこないます。
①ストリームを開く
②データを読み込む/書き込む
③ストリームを閉じる
ファイルに書き込む
BufferedWriterオブジェクトを生成するnewBufferedWriterメソッドの基本操作
データをバッファリングして効率的に書き込むBufferedWriterクラスを使用すます。(Java8以降で使用可能)BufferedWriterオブジェクトを生成する方法はいくつかありますが、Filesクラス(java.nio.filesパッケージ)のnewBufferedWriterメソッドを利用すると、戻り値としてBufferedWriterオブジェクトを返してくれて便利です。
public static BufferedWriter newBufferedWriter(Path path,
Charset cs,
OpenOption… options)
throws IOException
path :書き込みファイルのパス
cs :文字コード *指定しない場合はUTF-8
option:ファイルのオープンモード *指定しない場合は書き込みモード
オープンモードはStandardOpenOptionクラス(java.nio.fileパッケージ)で指定されます。
設定値 | 概要 |
WRITE | ファイルに読み込みモードでアクセスする |
READ | ファイルに書き込みモードでアクセスする |
APPEND | ファイルに追記モードでアクセスする |
CREATE | ファイルが存在しない場合に新規作成する |
CREATE_NEW | ファイル新規作成する(すでにファイルがある場合は失敗する) |
TRUNCATE_EXISTING | すでにファイルが存在し、且つWRITEモードの時、ファイルを空にする |
newBufferedWriterの場合、オープンモードを指定しないと書き込みモードになりますが、実際は①WRITE, ②CREATE, ③TRUNCATE_EXISTINGの3つが設定されています。
サンプルソースコード
package fileReadWrite;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String args[]){
try (var writer = Files.newBufferedWriter(Paths.get("./test.txt")))
{
writer.write("12345\nwrite test");
writer.newLine();
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
実行結果(test.txtファイルが生成されました)
12345
write test
サンプルソースコードはリソースを自動クローズする「try-with-sources文」を使用しています。
リソースとは、AutoCloseableインターフェースまたはCloseableインタフェースを実装したクラスをインスタンス化した変数の宣言です。tryのブロックを抜けるときにリソースがcloseされます。
try ( resource ) {
処理
}
ファイルを読み込む
読み込み用のファイルを用意しました。
Hello World!!
こんにちは
書き込み同様、newBufferedReaderメソッドを利用してBufferedReaderオブジェクトを生成します。
public static BufferedReader newBufferedReader(Path path,
Charset cs)
throws IOException
path :書き込みファイルのパス
cs :文字コード *指定しない場合はUTF-8
サンプルソースコード
package fileReadWrite;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String args[]){
try (var reader = Files.newBufferedReader(Paths.get("./readtest.txt")))
{
var line = "";
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
実行結果。ちゃんと読み込まれています。
Hello World!!
こんにちは
コメント