如何在java中的gzip中获取文件的文件名?

loc*_*ock 6 java gzip

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文件上使用它.任何替代品?

Max*_*Max 8

因为我有点同意"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压缩时变为。如果重命名该文件,名称信息将丢失。

  • 这并不完全正确。如果查看GZIP的RFC(http://www.ietf.org/rfc/rfc1952.txt),在2.3.1中,第4个字节的第4位用于指定原始文件名。 (6认同)
  • -1不完全正确,GZIP格式可以保存原始文件名和时间戳。只需查看 GNU gzip/gunzip 的手册页,即可查看压缩和解压缩的“--name”和“--no-name”选项。 (4认同)
  • 是的,这个答案是完全错误的。Gzip 将名称和时间戳保存在压缩流中。您必须使用 -n 选项明确指示是否不保存此信息。 (3认同)