我在。广州格式的文件。阅读此文件中的Java类是GZIPInputStream。 但是,此类不扩展BufferedReader类的Java。其结果是,我不能够按行读取文件中的行。我需要的是这样的

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

我虽然创建我类扩展了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归因
不隶属于 StackOverflow
scroll top