Java によるバイナリファイルの読み込みと書き込み

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

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

Java の DataInputStream と DataOutputStream

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

写真のコピー

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

package com.keicode.java.test;

import java.io.*;

public class TestApp {
  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("/Users/user1/test.jpg")));
      // To copy.jpg
      DataOutputStream dataOutStream =
          new DataOutputStream(
              new BufferedOutputStream(
                  new FileOutputStream("/Users/user1/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 (IOException e) {
      e.printStackTrace();
    }
  }
}

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

DataInputStream と DataOutputStream

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

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

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

package com.keicode.java.test;

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

public class TestApp {
  public static void main(String[] args) {
    try {

      String filePath = "/Users/user1/hello.txt";
      String zipPath = "/Users/user1/a.zip";

      // zip file
      ZipOutputStream zipOutStream =
          new ZipOutputStream(
              new FileOutputStream(zipPath));

      // zip entry
      ZipEntry entry = new ZipEntry("hello.txt");
      // original file
      FileInputStream fileInStream = new FileInputStream(filePath);

      zipOutStream.putNextEntry(entry);
      int i = fileInStream.read();
      while (i != -1) {
        zipOutStream.write(i);
        i = fileInStream.read();
      }
      fileInStream.close();
      zipOutStream.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

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

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門