【发布时间】:2015-02-25 09:01:50
【问题描述】:
gzip 是documented 支持压缩文件的拼接:
$ echo hello >hhh
$ echo world >www
$ cat hhh www
hello
world
$ echo hello | gzip >hhhh
$ echo world | gzip >wwww
$ cat hhhh wwww | gunzip
hello
world
我可以使用GZIPOutputStream 创建一个连接文件,但不幸的是GZIPInputStream 只读取数据的第一部分(从命令行运行的gunzip 读取所有数据。)
我在 Android 4.1.2 和 4.4.2 上都看到了这一点。
如何从 Java 中读取整个文件?
更新:
演示错误的示例(主机版本):
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
class GZTest {
static void append(File f, String s) {
try {
FileOutputStream fos = new FileOutputStream(f, true);
//FileOutputStream gzos = fos;
GZIPOutputStream gzos = new GZIPOutputStream(fos);
gzos.write(s.getBytes("UTF-8"));
gzos.close(); // TODO: do it finally{}
fos.close(); // TODO: do it finally{}
} catch (IOException e) {
e.printStackTrace();
}
}
static String readAll(File f) {
try {
FileInputStream fis = new FileInputStream(f);
//FileInputStream gzis = fis;
GZIPInputStream gzis = new GZIPInputStream(fis);
byte[] buf = new byte[4096];
int len = gzis.read(buf);
gzis.close(); // TODO: do it finally{}
fis.close(); // TODO: do it finally{}
return new String(Arrays.copyOf(buf, len), "UTF-8");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
public class A {
public static void main(String[] args) {
System.out.println("~~~");
File f = new File("x.y");
f.delete();
GZTest.append(f, "Hello, ");
GZTest.append(f, "world!\n");
System.out.println(GZTest.readAll(f));
}
}
运行它:
$ javac A.java
$ java A
~~~
Hello,
$ gunzip <x.y
Hello, world!
更新2
看起来这是错误 JDK-2192186,据报道已于 2010-08-03 修复。然而,这个错误现在就在这里。
【问题讨论】:
-
你试过在第一个完成后创建第二个“GZIPInputStream”吗?
-
顺便看看这个:*.com/questions/13749891/…
-
是的...顺便说一句,我在主机上看到与
java version "1.8.0_31"相同的错误 错误报告提供了一种解决方法,但代码很糟糕。 Oracle 是否发布了应用了修复的代码?