Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職

FileInputStream/FileOutputStreamクラス

バイナリファイルの操作 – FileInputStream/FileOutputStreamクラス
FileInputStream(String name)
FileOutputStream(String name [,boolean append])
name:ファイルのパス append:追記モードで開くか

画像などのバイナリファイルを読み書きするには、FileInputStream/FileOutputStreamクラスを利用します。FileInputStream/FileOutputStreamクラスの主なメソッドは、以下の通りです。

FileInputStream/FileOutputStreamクラスの主なメソッド
クラス メソッド 概要
FileInputStream int read([byte[] b [,int off, int len]]) 入力ストリームからバイト配列bに読み込み
(offは開始位置、lenは読み込み長)
long skip(long n) 読み込みをnバイトだけスキップ
void close() ストリームを閉じる
FileOutputStream void write(byte[] b [,int off, int len] バイト配列bの内容を出力ストリームに書き出し
(offは開始位置、lenは読み込み長)
void close() ストリームを閉じる

たとえば以下はsample.jpgを読み込み、その内容をそのままsample2.jpgに書きだす例です。

StreamBinary.java

package com.example.mynavi.stream;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class StreamBinary {
  public static void main(String[] args) {
    try (FileInputStream in = new FileInputStream("C:/data/sample.jpg");
        FileOutputStream out = new FileOutputStream("C:/data/sample2.jpg")) {
      int data;
      while ((data = in.read()) != -1) {
        out.write((byte) data);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

FileInputStream/FileOutputStreamコンストラクターで操作対象のパスを指定することで、それぞれファイルを読み取り/書き込み専用で開けます。
ファイルからバイトデータを読み込むにはreadメソッドを利用します。readメソッドは、読み込みに成功した場合はその値を、読み込むべきデータがなかった場合には-1を返します。上では、その性質を利用して、readメソッドが-1を返すまでwhileループを繰り返すことで、ファイルの内容をすべて読み込めます。
バイトデータは、writeメソッドを利用することで、対象のファイルに書き込みます。

note

try-with-resource構文
ファイルなど共有のリソースを利用する際には、tryブロック直後のカッコで宣言します。これによって、リソースはtryブロックを抜けるタイミングで自動的に解放されますので、いわゆる「ファイルの閉じ忘れ」を防げます。この構文は、JavaSE 7で新たに追加された構文で、try-with-resources構文と呼ばれます。

ストリーム
ストリーム
FileInputStream/FileOutputStreamクラス
InputStreamReader/OutputStreamWriterクラス
BufferedReader/BufferedWriterクラス
ObjectInputStream/ObjectOutputStreamクラス
Fileクラス

Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職