Javaでtarファイルを操作する

Javaでtarファイルを操作する場合には、Commons Compressを使用するのが簡単そうです。Commons Compresは他にもbzip2やgzipにも対応しています。サイトのサンプルとJavadocを見ればだいたいの使い方はわかると思いますが。

File[] filesToArchive = {file1, file2}
File tarFile = new File("C:\\temp\\foo.tar");
TarArchiveOutputStream out = new TarArchiveOutputStream(new FileOutputStream(tarFile));
for(File f : filesToArchive){
	out.putArchiveEntry(new TarArchiveEntry(f, f.getName()));
	out.write(org.apache.commons.io.FileUtils.readFileToByteArray(f));
	out.closeArchiveEntry();
}
out.close();

tarがファイルのユーザ情報やパーミッションなどのヘッダ情報を保持できるため、TarArchiveEntryのコンストラクタにFileオブジェクトを渡すことで、追加するファイルを元にエントリのヘッダ情報を生成しています*1。ヘッダ情報はバイト列などからも指定可能です。

TarArchiveInputStream in = new TarArchiveInputStream(new FileInputStream(C:\\temp\\foo.tar"));
assertEquals(file1.getName(), in.getNextTarEntry().getName());
assertEquals(file2.getName(), in.getNextTarEntry().getName());
assertNull(in.getNextTarEntry()); // ファイルは2個だけ

*1:http://commons.apache.org/compress/apidocs/index.html?org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.html