使用 Java 组合压缩的 Gzipped 文本文件
Combining compressed Gzipped Text Files using Java
我的问题可能与 Java 不完全相关,但我目前正在寻找一种方法来组合多个压缩(gzip 压缩)文本文件,而无需手动重新压缩它们。假设我有 4 个文件,所有文本都是使用 gzip 压缩的,并且想将它们压缩到一个 *.gz 文件中,而不需要重新压缩它们。我目前的方法是打开一个 InputStream 并按行解析文件,存储在 GZIPoutputstream 中,它可以工作但速度不是很快....我当然也可以调用
zcat file1 file2 file3 | gzip -c > output_all_four.gz
这也可以,但速度也不是很快。
我的想法是复制输入流并将其直接写入输出流而不 "parsing" 流,因为我实际上不需要操作任何东西。这样的事情可能吗?
在下面找到 Java 中的一个简单解决方案(它与我的 cat ...
示例相同)。 input/output 的任何类型的缓冲都已被省略以保持代码精简。
public class ConcatFiles {
public static void main(String[] args) throws IOException {
// concatenate the single gzip files to one gzip file
try (InputStream isOne = new FileInputStream("file1.gz");
InputStream isTwo = new FileInputStream("file2.gz");
InputStream isThree = new FileInputStream("file3.gz");
SequenceInputStream sis = new SequenceInputStream(new SequenceInputStream(isOne, isTwo), isThree);
OutputStream bos = new FileOutputStream("output_all_three.gz")) {
byte[] buffer = new byte[8192];
int intsRead;
while ((intsRead = sis.read(buffer)) != -1) {
bos.write(buffer, 0, intsRead);
}
bos.flush();
}
// ungezip the single gzip file, the output contains the
// concatenated input of the single uncompressed files
try (GZIPInputStream gzipis = new GZIPInputStream(new FileInputStream("output_all_three.gz"));
OutputStream bos = new FileOutputStream("output_all_three")) {
byte[] buffer = new byte[8192];
int intsRead;
while ((intsRead = gzipis.read(buffer)) != -1) {
bos.write(buffer, 0, intsRead);
}
bos.flush();
}
}
}
如果您只需要对许多压缩文件进行 gzip,则上述方法有效。在我的例子中,我制作了一个 web servlet,我的响应是 20-30 KB。所以我发送了压缩回复。
我尝试仅在服务器启动时压缩我所有的个人 JS 文件,然后使用上述方法添加动态代码运行时。我可以在我的日志文件中打印整个响应,但 chrome 只能解压缩第一个文件。其余输出以字节为单位。
经过研究,我发现 chrome 无法做到这一点,他们也没有解决就关闭了这个错误。
我的问题可能与 Java 不完全相关,但我目前正在寻找一种方法来组合多个压缩(gzip 压缩)文本文件,而无需手动重新压缩它们。假设我有 4 个文件,所有文本都是使用 gzip 压缩的,并且想将它们压缩到一个 *.gz 文件中,而不需要重新压缩它们。我目前的方法是打开一个 InputStream 并按行解析文件,存储在 GZIPoutputstream 中,它可以工作但速度不是很快....我当然也可以调用
zcat file1 file2 file3 | gzip -c > output_all_four.gz
这也可以,但速度也不是很快。
我的想法是复制输入流并将其直接写入输出流而不 "parsing" 流,因为我实际上不需要操作任何东西。这样的事情可能吗?
在下面找到 Java 中的一个简单解决方案(它与我的 cat ...
示例相同)。 input/output 的任何类型的缓冲都已被省略以保持代码精简。
public class ConcatFiles {
public static void main(String[] args) throws IOException {
// concatenate the single gzip files to one gzip file
try (InputStream isOne = new FileInputStream("file1.gz");
InputStream isTwo = new FileInputStream("file2.gz");
InputStream isThree = new FileInputStream("file3.gz");
SequenceInputStream sis = new SequenceInputStream(new SequenceInputStream(isOne, isTwo), isThree);
OutputStream bos = new FileOutputStream("output_all_three.gz")) {
byte[] buffer = new byte[8192];
int intsRead;
while ((intsRead = sis.read(buffer)) != -1) {
bos.write(buffer, 0, intsRead);
}
bos.flush();
}
// ungezip the single gzip file, the output contains the
// concatenated input of the single uncompressed files
try (GZIPInputStream gzipis = new GZIPInputStream(new FileInputStream("output_all_three.gz"));
OutputStream bos = new FileOutputStream("output_all_three")) {
byte[] buffer = new byte[8192];
int intsRead;
while ((intsRead = gzipis.read(buffer)) != -1) {
bos.write(buffer, 0, intsRead);
}
bos.flush();
}
}
}
如果您只需要对许多压缩文件进行 gzip,则上述方法有效。在我的例子中,我制作了一个 web servlet,我的响应是 20-30 KB。所以我发送了压缩回复。
我尝试仅在服务器启动时压缩我所有的个人 JS 文件,然后使用上述方法添加动态代码运行时。我可以在我的日志文件中打印整个响应,但 chrome 只能解压缩第一个文件。其余输出以字节为单位。
经过研究,我发现 chrome 无法做到这一点,他们也没有解决就关闭了这个错误。