当前位置: 首页 > 面试题库 >

GZIPInputStream逐行读取

贝杜吟
2023-03-14
问题内容

我有一个.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声明中包含“
encoding”属性。此外,应该真正使用XML解析器而不是文本来处理XML。逐行读取XML似乎是一种脆弱的特殊情况。

未能明确指定编码违反第二条诫命。 使用默认编码会带来麻烦!



 类似资料:
  • 稳定性: 2 - 稳定的 require('readline') 模块提供了一个接口,用于从可读流(如 process.stdin)读取数据,每次读取一行。 它可以通过以下方式使用: const readline = require('readline'); 例子,readline 模块的基本用法: const readline = require('readline'); const rl

  • 我试图在Java中使用GZIPInputStream来解压缩来自我的。NET应用程序(它以GZIP格式压缩)的图像数据。图像数据以Base64字符串传输,因为它是作为XML文本同步的。我假设流会读取到传入. read()参数的缓冲区中,直到缓冲区饱和。它没有像我预期的那样工作,也就是说,. read()每次读取操作只能读取800字节左右。这对于小图像不是问题,但对于大图像,如800 KB,解压缩需

  • 我正在努力阅读附加的TXT文件,以csv形式显示从文件中读取的每个字段,我做了一个接近我想要的代码,但我没有前进。 TXT文件格式: 我的代码在我想要的位置读取第一行,但下面的行我不能,更不用说重复文件中包含的下一个工资单的读数了。 目前的输出是这样的: 出口应该是怎样的 逐行读取和捕获数据,我必须完成一个工资单,它将在输出中形成一行,第二个工资单将在输出中形成第二行,因此,直到txt文件结束,此

  • 问题内容: 给定一个不太长的字符串,逐行读取字符串的最佳方法是什么? 我知道你可以做: 另一种方法是在eol上获取子字符串: 还有其他更简单的方法吗?我对上述方法没有任何问题,只是想知道你们中是否有人知道一些看起来更简单,更有效的方法? 问题答案: 您也可以使用String方法: 这使您可以方便地将所有行排列在一起。 我不知道拆分的性能。它使用正则表达式。

  • 我正在试着阅读我的文件的每一行,其中包含一个用户名列表,并用它创建一个登录系统。我正在尝试实现一个基本的登录系统,它的用户名存储在.txt文件中,但我的代码不工作,我不知道为什么。我认为问题出在检查用户名的循环中。 这是我的代码,但它不起作用,只是打印总是失败: 有什么想法吗?

  • 介绍 (Introduction) java.util.zip.GZIPInputStream类实现了一个流过滤器,用于读取GZIP文件格式的压缩数据。 类声明 以下是java.util.zip.GZIPInputStream类的声明 - public class GZIPInputStream extends InflaterInputStream 字段 (Fields) 以下是java