/******************************************************************************* * Copyright (c) MOBAC developers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package mobac.utilities.tar; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arrays; import mobac.utilities.stream.CountingOutputStream; /** * Creates a new tar file and allows to add files from the file system or * "virtual files" that only exist in memory as <code>byte[]</code>. */ public class TarArchive { protected CountingOutputStream tarFileStream; protected File tarFile; protected File baseDir; /** * * @param tarFile * @param baseDir * root directory used for getting the relative path when adding * a file from the file system. If only in memory files are added * this parameter can be <code>null</code> * @throws FileNotFoundException */ public TarArchive(File tarFile, File baseDir) throws FileNotFoundException { this.tarFile = tarFile; this.tarFileStream = new CountingOutputStream(new BufferedOutputStream( new FileOutputStream(tarFile, false))); this.baseDir = baseDir; } public long getTarFilePos() { return tarFileStream.getBytesWritten(); } public boolean writeContentFromDir(File dirToAdd) throws IOException { if (!dirToAdd.isDirectory()) return false; TarHeader th = new TarHeader(dirToAdd, baseDir); writeTarHeader(th); File[] files = dirToAdd.listFiles(); Arrays.sort(files); for (File f : files) { if (!f.isDirectory()) writeFile(f); else writeContentFromDir(f); } return true; } public void writeFile(File fileOrDirToAdd) throws IOException { TarHeader th = new TarHeader(fileOrDirToAdd, baseDir); writeTarHeader(th); if (!fileOrDirToAdd.isDirectory()) { TarRecord tr = new TarRecord(fileOrDirToAdd); tarFileStream.write(tr.getRecordContent()); } } public void writeDirectory(String dirName) throws IOException { TarHeader th = new TarHeader(dirName, 0, true); writeTarHeader(th); } /** * Writes a "file" into tar archive that does only exists in memory * * @param fileName * @param data * @throws IOException */ public void writeFileFromData(String fileName, byte[] data) throws IOException { writeFileFromData(fileName, data, 0, data.length); } /** * Writes a "file" into tar archive that does only exists in memory * * @param fileName * @param data * @param off * @param len * @throws IOException */ public void writeFileFromData(String fileName, byte[] data, int off, int len) throws IOException { TarHeader th = new TarHeader(fileName, len, false); writeTarHeader(th); TarRecord tr = new TarRecord(data, off, len); tarFileStream.write(tr.getRecordContent()); } protected void writeTarHeader(TarHeader th) throws IOException { tarFileStream.write(th.getBytes()); } public void writeEndofArchive() throws IOException { byte[] endOfArchive = new byte[1024]; tarFileStream.write(endOfArchive); tarFileStream.flush(); } public void close() { try { tarFileStream.close(); } catch (Exception e) { } tarFileStream = null; } public File getTarFile() { return tarFile; } }