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 を使って出力します。
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 に出力することによってファイルを圧縮しています。