Java 入門

ホーム > 基本的な I/O > バイナリファイルの読み込みと書き込み

バイナリファイルの読み込みと書き込み

ここでは Java でバイナリファイルを扱ってみましょう。

テキストファイルについては、テキストファイルの読み込みと書き込み で既にみていますので、 そちらがまだの方はざっとみてからこちらに戻られると良いと思います。

DataInputStream と DataOutputStream

バイナリファイルの読込みと書き込みのサンプルとして、ここでは jpeg 画像をコピーするプログラムを書きましょう。

写真のコピー

バイナリのデータの入出力のため、 DataInputStream (入力) と DataOutputStream (出力) を使います。

package com.keicode.java.test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class StreamTest6 {

  public static void main(String[] args) {
    try {
      byte[] b = new byte[4096];
      int readByte = 0, totalByte = 0;
      
      // From test.jpg
      DataInputStream dataInStream = 
        new DataInputStream(
          new BufferedInputStream(
            new FileInputStream("/home/keisukeo/tmp/test.jpg")));
      // To copy.jpg
      DataOutputStream dataOutStream = 
        new DataOutputStream(
          new BufferedOutputStream(
            new FileOutputStream("/home/keisukeo/tmp/copy.jpg")));

      while(-1 != (readByte = dataInStream.read(b))){
        dataOutStream.write(b, 0, readByte);
        totalByte += readByte;
        System.out.println("Read: " + readByte + " Total: " + totalByte);
      }
      
      dataInStream.close();
      dataOutStream.close();
      
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

}

ここでは4キロバイトのバッファを用意しておき、そこに DataInputStream を用いてデータを読み込みます。 読み込んだデータは DataOutputStream を使って出力します。

DataInputStream と DataOutputStream

Zip ストリームによるファイルの圧縮とアーカイブ

ストリームの良いところはなんといっても、それをネストすることによって、機能を付け足していけるところがあげられます。

ここまではせいぜいバッファリングするとか、そういう程度でしたが、ここではもう一歩便利なクラスをみてみましょう。ZipOutputStream によるファイルの圧縮とアーカイブです。

package com.keicode.java.test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class StreamTest7 {

  public static void main(String[] args) {
    try {
      
      String filePath = "/home/keisukeo/tmp/a.html";
      String zipPath  = "/home/keisukeo/tmp/a.zip";
      
      // zip file
      ZipOutputStream zipOutStream = 
        new ZipOutputStream(
          new FileOutputStream(zipPath));

      // zip entry
      ZipEntry entry = new ZipEntry("a.html");
      
      // original file
      FileInputStream fileInStream = new FileInputStream(filePath);
      
      zipOutStream.putNextEntry(entry);
      for(int i = fileInStream.read(); 
        i != -1; 
        i=fileInStream.read()){
        zipOutStream.write(i);
      }
      
      fileInStream.close();
      zipOutStream.close();
      
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

}

この例ではテキストファイルを読み込み、ZipOutputStream に出力することによってファイルを圧縮しています。

ホーム > 基本的な I/O > バイナリファイルの読み込みと書き込み