注目記事

【Javaコード入門】ストリーム_②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() 読み込みをnバイトだけスキップ
void close() ストリームを閉じる

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

StreamBinary.java
  1. package com.example.mynavi.stream;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6.  
  7. public class StreamBinary {
  8.   public static void main(String[] args) {
  9.     try (var in = new FileInputStream("C:/data/sample.jpg");
  10.         var out = new FileOutputStream("C:/data/sample2.jpg")) {
  11.       int data;
  12.       while ((data = in.read()) != -1) {
  13.         out.write((byte) data);
  14.       }
  15.     } catch (IOException e) {
  16.       e.printStackTrace();
  17.     }
  18.   }
  19. }

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

 

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

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

監修

山田祥寛(有限会社 WINGSプロジェクト)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NEC にてシステム企画業務に携わるが、2003年 4 月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト(https://wings.msn.to/)」の代表でもある。主な著書に『改訂 3 版JavaScript 本格入門』(技術評論社)、「独習シリーズ(C#・Python・PHP・Ruby・JSP&サーブレットなど)」(翔泳社)、「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravel など)」(Amazon Kindle)など。売り上げの累計は100万部を超える。