我有。广州格式的文件。 阅读此文件中的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);
您可以在一个实用程序类使用下面的方法,并用它在必要时...
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();}