如何在 Java 中完全从内存中的对象(无文件)创建 tar 或 tar.gz 存档
How do I create a tar or tar.gz archive entirely from objects in memory (no files) in Java
如何在 Java 中创建没有 File
和实际文件支持的 tar 或 gzip 压缩 tar 存档?
我找到了 commons-compress,但是示例和大部分文档依赖于使用可以被 Java File
对象引用的现有文件。如果我不想使用 File
对象并想从 byte[]
.
构建我的 tar 存档怎么办
TarArchiveEntry
的唯一构造函数提供了一种设置内容的方法接受 File
并且没有 setter 的内容。
来自 documentation 的 TarArchiveEntry:
TarArchiveEntry(File file)
Construct an entry for a file.
TarArchiveEntry(File file, String fileName)
Construct an entry for a file.
使用 commons-compress,它在文档中并没有立即清楚或举例说明,但这里是它的要点
//Get the content you want to lay down into a byte[]
byte content[] = "I am some simple content that should be written".getBytes();
//Name your entry with the complete path relative to the base directory
//of your archive. Any directories that don't exist (e.g. "testDir") will
//be created for you
TarArchiveEntry textFile = new TarArchiveEntry("testDir/hello.txt");
//Make sure to set the size of the entry. If you don't you will not be able
//to write to it
textFile.setSize(content.length);
TarArchiveOutputStream gzOut = null;
try {
/*In this case I chose to show how to lay down a gzipped archive.
You could just as easily remove the GZIPOutputStream to lay down a plain tar.
You also should be able to replace the FileOutputStream with
a ByteArrayOutputStream to lay nothing down on disk if you wanted
to do something else with your newly created archive
*/
gzOut = new TarArchiveOutputStream(
new GZIPOutputStream(
new BufferedOutputStream(
new FileOutputStream("/tmp/mytest.tar.gz")
)));
//When you put an ArchiveEntry into the archive output stream,
//it sets it as the current entry
gzOut.putArchiveEntry(textFile);
//The write command allows you to write bytes to the current entry
//on the output stream, which was set by the above command.
//It will not allow you to write any more than the size
//that you specified when you created the archive entry above
gzOut.write(content);
//You must close the current entry when you are done with it.
//If you are appending multiple archive entries, you only need
//to close the last one. The putArchiveEntry automatically closes
//the previous "current entry" if there was one
gzOut.closeArchiveEntry();
} catch (Exception ex) {
System.err.println("ERROR: " + ex.getMessage());
} finally {
if (gzOut != null) {
try {
gzOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
如何在 Java 中创建没有 File
和实际文件支持的 tar 或 gzip 压缩 tar 存档?
我找到了 commons-compress,但是示例和大部分文档依赖于使用可以被 Java File
对象引用的现有文件。如果我不想使用 File
对象并想从 byte[]
.
TarArchiveEntry
的唯一构造函数提供了一种设置内容的方法接受 File
并且没有 setter 的内容。
来自 documentation 的 TarArchiveEntry:
TarArchiveEntry(File file)
Construct an entry for a file.
TarArchiveEntry(File file, String fileName)
Construct an entry for a file.
使用 commons-compress,它在文档中并没有立即清楚或举例说明,但这里是它的要点
//Get the content you want to lay down into a byte[]
byte content[] = "I am some simple content that should be written".getBytes();
//Name your entry with the complete path relative to the base directory
//of your archive. Any directories that don't exist (e.g. "testDir") will
//be created for you
TarArchiveEntry textFile = new TarArchiveEntry("testDir/hello.txt");
//Make sure to set the size of the entry. If you don't you will not be able
//to write to it
textFile.setSize(content.length);
TarArchiveOutputStream gzOut = null;
try {
/*In this case I chose to show how to lay down a gzipped archive.
You could just as easily remove the GZIPOutputStream to lay down a plain tar.
You also should be able to replace the FileOutputStream with
a ByteArrayOutputStream to lay nothing down on disk if you wanted
to do something else with your newly created archive
*/
gzOut = new TarArchiveOutputStream(
new GZIPOutputStream(
new BufferedOutputStream(
new FileOutputStream("/tmp/mytest.tar.gz")
)));
//When you put an ArchiveEntry into the archive output stream,
//it sets it as the current entry
gzOut.putArchiveEntry(textFile);
//The write command allows you to write bytes to the current entry
//on the output stream, which was set by the above command.
//It will not allow you to write any more than the size
//that you specified when you created the archive entry above
gzOut.write(content);
//You must close the current entry when you are done with it.
//If you are appending multiple archive entries, you only need
//to close the last one. The putArchiveEntry automatically closes
//the previous "current entry" if there was one
gzOut.closeArchiveEntry();
} catch (Exception ex) {
System.err.println("ERROR: " + ex.getMessage());
} finally {
if (gzOut != null) {
try {
gzOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}