繁体   English   中英

GZIPInputStream 逐行读取

[英]GZIPInputStream reading line by line

我有一个 .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());

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

装饰器的基本设置是这样的:

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

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

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

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

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

未能明确指定编码是违反第二条诫命的。 使用默认编码有风险!

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

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);

您可以在 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;
}

这是一行

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM