【问题标题】:GZIPInputStream reading line by lineGZIPInputStream 逐行读取
【发布时间】:2010-11-07 23:59:11
【问题描述】:

我有一个 .gz 格式的文件。用于读取该文件的 java 类是 GZIPInputStream。 但是,这个类并没有扩展 java 的 BufferedReader 类。结果,我无法逐行读取文件。我需要这样的东西

reader  = new MyGZInputStream( some constructor of GZInputStream) 
reader.readLine()...

我想创建一个扩展 Java 的 Reader 或 BufferedReader 类的类,并使用 GZIPInputStream 作为其变量之一。

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Reader;
import java.util.zip.GZIPInputStream;

public class MyGZFilReader extends Reader {

    private GZIPInputStream gzipInputStream = null;
    char[] buf = new char[1024];

    @Override
    public void close() throws IOException {
        gzipInputStream.close();
    }

    public MyGZFilReader(String filename)
               throws FileNotFoundException, IOException {
        gzipInputStream = new GZIPInputStream(new FileInputStream(filename));
    }

    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        // TODO Auto-generated method stub
        return gzipInputStream.read((byte[])buf, off, len);
    }

}

但是,当我使用时,这不起作用

BufferedReader in = new BufferedReader(
    new MyGZFilReader("F:/gawiki-20090614-stub-meta-history.xml.gz"));
System.out.println(in.readLine());

有人可以建议如何进行..

【问题讨论】:

  • 看看这个链接stackoverflow.com/q/6717165/779408。一个压缩和解压缩方法在那里表示。
  • 为了热爱这个世界上所有美好和正确的事物,也为了任何编写哪怕是非常有价值的代码的开发人员的理智......注意@erickson 指出的编码!他是唯一指出这一点的答案,这让我想哭。

标签: java file-io filereader gzipinputstream


【解决方案1】:

这里只有一行

try (BufferedReader br = new BufferedReader(
        new InputStreamReader(
           new GZIPInputStream(
              new FileInputStream(
                 "F:/gawiki-20090614-stub-meta-history.xml.gz"))))) 
     {br.readLine();}

【讨论】:

    【解决方案2】:

    你可以在一个 util 类中使用下面的方法,并在需要的时候使用它...

    public static List<String> readLinesFromGZ(String filePath) {
        List<String> lines = new ArrayList<>();
        File file = new File(filePath);
    
        try (GZIPInputStream gzip = new GZIPInputStream(new FileInputStream(file));
                BufferedReader br = new BufferedReader(new InputStreamReader(gzip));) {
            String line = null;
            while ((line = br.readLine()) != null) {
                lines.add(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace(System.err);
        } catch (IOException e) {
            e.printStackTrace(System.err);
        }
        return lines;
    }
    

    【讨论】:

      【解决方案3】:

      装饰器的基本设置如下:

      InputStream fileStream = new FileInputStream(filename);
      InputStream gzipStream = new GZIPInputStream(fileStream);
      Reader decoder = new InputStreamReader(gzipStream, encoding);
      BufferedReader buffered = new BufferedReader(decoder);
      

      这个sn-p中的关键问题是encoding的值。这是文件中文本的字符编码。是“US-ASCII”、“UTF-8”、“SHIFT-JIS”、“ISO-8859-9”……?有数百种可能性,通常无法从文件本身确定正确的选择。它必须通过一些带外通道来指定。

      例如,可能是平台默认设置。然而,在网络环境中,这是极其脆弱的。写入文件的机器可能位于相邻的隔间中,但具有不同的默认文件编码。

      大多数网络协议都使用标头或其他元数据来明确注明字符编码。

      在这种情况下,从文件扩展名来看,内容是 XML。为此,XML 在 XML 声明中包含“编码”属性。此外,XML 确实应该使用 XML 解析器进行处理,而不是作为文本处理。逐行读取 XML 似乎是一种脆弱的特殊情况。

      未能明确指定编码是against the second commandment. 使用默认编码后果自负!

      【讨论】:

      • 谢谢它的工作......但是,不需要阅读器步骤..我们也可以将其写为 GZIPInputStream gzip = new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-元历史.xml.gz")); BufferedReader br = new BufferedReader(new InputStreamReader(gzip));
      • @KapilD 令我难过的是,您完全错过了他关于编码的观点……如您的评论和评论中的示例所示。重新阅读埃里克森的答案....可能超过 30 次。
      • gzip 命令如何知道编码?我想从世界各地的很多 linux/unix 服务器中读取很多文件......所以我想确保我这样做是正确的......帖子中提到的编码通常不能由文件本身确定...但是 gzip -d 命令似乎可以在没有单独输入的情况下处理任何文件...(它是我现在使用但想规避的)所以我想如果我能弄清楚 gzip 是做什么来知道编码的,我可以做同样的事情。任何想法/建议都可以为我指明正确的方向吗?
      • @glyphx 你的问题不清楚。您的意思是在没有关于内容类型的一些外部断言的情况下如何识别 gzip 文件?一个提示是文件扩展名,另一个提示是文件头中存在幻数 0x1F8B。但是,在您真正处理整个文件之前,您无法知道一个文件是一个有效的 gzip 文件。
      • 要清楚,我知道这些文件是 gzip 文件。压缩后的文件都是基于文本的文件,例如 csv 和 pipe delim 文件。我只想能够直接用java逐行读取这些文件。我可以 gzip -d 它们然后逐行阅读它们没有问题。我只是在您的 cmets 中对必须指定编码感到困惑......我认为大多数文件都是 ASCII ......但有些可能有亚洲字符,所以也许是 UTF-8?我只是想确保我正确地做到了这一点......这更清楚吗?谢谢!
      【解决方案4】:
      GZIPInputStream gzip = new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz"));
      BufferedReader br = new BufferedReader(new InputStreamReader(gzip));
      br.readLine();
      

      【讨论】:

      • 您的回答很棒。简明扼要..不过,埃里克森的回答更详细。
      【解决方案5】:
      BufferedReader in = new BufferedReader(new InputStreamReader(
              new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz"))));
      
      String content;
      
      while ((content = in.readLine()) != null)
      
         System.out.println(content);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-17
        • 1970-01-01
        • 1970-01-01
        • 2012-02-16
        • 1970-01-01
        • 2012-04-09
        • 2012-08-11
        • 2015-08-24
        相关资源
        最近更新 更多