int BUFFER_SIZE = 4096;
byte[] buffer = new byte[BUFFER_SIZE];
InputStream input = new GZIPInputStream(new FileInputStream("a_gunzipped_file.gz"));
OutputStream output = new FileOutputStream("current_output_name");
int n = input.read(buffer, 0, BUFFER_SIZE);
while (n >= 0) {
output.write(buffer, 0, n);
n = input.read(buffer, 0, BUFFER_SIZE);
}
}catch(IOException e){
System.out.println("error: \n\t" + e.getMessage());
}
Run Code Online (Sandbox Code Playgroud)
使用上面的代码我可以成功地提取gzip的内容,尽管提取的文件的文件名正如预期的那样总是current_output_name(我知道它,因为我在代码中声明它是这样的).我的问题是我不知道如何获取文件的文件名仍然在存档内.
虽然java.util.zip提供了ZipEntry,但我无法在gzip文件上使用它.任何替代品?
因为我有点同意"Michael Borgwardt"对他的回复,但这并不完全正确,gzip文件规范包含一个存储在gz文件头中的可选文件名,遗憾的是没有办法(据我所知)在当前的java(1.6)中获取该名称.如在openjdk 中的getHeader方法中执行GZIPInputStream所见
他们跳过阅读文件名
// Skip optional file name
if ((flg & FNAME) == FNAME) {
while (readUByte(in) != 0) ;
}
Run Code Online (Sandbox Code Playgroud)
我已经修改了类GZIPInputStream来获取gzip存档中的可选文件名(我不确定我是否被允许这样做)(从这里下载原始版本),你只需要添加一个成员字符串文件名; 到类,并修改上面的代码为:
// Skip optional file name
if ((flg & FNAME) == FNAME) {
filename= "";
int _byte = 0;
while ((_byte= readUByte(in)) != 0){
filename += (char)_byte;
}
}
Run Code Online (Sandbox Code Playgroud)
它对我有用.
Mic*_*rdt -1
Gzip 是纯粹的压缩。没有存档,只是压缩的文件数据。
约定是 gzip 附加.gz到文件名,gunzip 删除该扩展名。因此,压缩时logfile.txt变为logfile.txt.gz,解logfile.txt压缩时变为。如果重命名该文件,名称信息将丢失。