【Java】入出力ファイルの操作は簡単だ!〜ストリームを理解する〜

Java imageJava
Java image
Java

入出力ストリームとは

ストリーム(stream)は「小さな川」という意味で、データの入出力の流れを表しています。
ファイルやネットワークからデータを受け取る入力ストリームとデータを書き出す出力ストリームがあります。java.ioパッケージには媒体の種類や入出力によって区分された4つの抽象スーパークラスがあります。バイナリデータを扱うのをバイトストリーム、テキストデータを扱うのを文字ストリームと呼びます。

入出力ストリームの種類

上記4つの入出力ストリームを基底クラスに持ち、メモリやファイルなど操作の対象応じたクラスが用意されています。(これが、入出力ストリームをややこしくしていますよね)
java.ioパッケージの主なクラスをまとめました。

概要入力文字ストリーム出力文字ストリーム入力バイトストリーム出力バイトストリーム
基底クラスReaderWriterInputStreamOutputStream
ファイルをストリームとして扱うFileReaderFileWriterFileInputStreamFileOutputStream
配列をストリームとして扱うCharArrayReaderCharArrayWriterByteArrayInputStreamByteArrayOutputStream
バッファイリングするBufferedReaderBufferedWriterBufferedInputStreamBufferedOutputStream
パイプによる処理を行うPipedReaderPipedWriterPipedInputStreamPipedOutputStream
メモリ内の文字列をストリームとして扱うStringReaderStringWriter
オブジェクトをストリームとして扱うObjectInputStreamObjectOutputStream
primitiveデータ型をストリームとして扱うDataInputStreamDataOutputStream

ストリーム基本操作

ストリームを扱う際は、必ずストリームのオープンとストリームのクローズをおこないます。

①ストリームを開く
②データを読み込む/書き込む
③ストリームを閉じる

ファイルに書き込む

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モードの時、ファイルを空にする
Standard Open Option

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!!
こんにちは

コメント

タイトルとURLをコピーしました