我有一个.gz格式的文件。用于读取此文件的java类是GZIPInputStream。 但是,此类不会扩展Java的BufferedReader类。结果,我无法逐行读取文件。我需要这样的东西
reader = new MyGZInputStream( some constructor of GZInputStream)
reader.readLine()...
我创建了扩展Reader或BufferedReader类java的类,并使用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());
有人可以建议如何继续......
答案 0 :(得分:131)
装饰器的基本设置如下:
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似乎是一个脆弱的特殊情况。
未能明确指定编码是against the second commandment. 使用默认编码会导致危险!
答案 1 :(得分:41)
GZIPInputStream gzip = new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz"));
BufferedReader br = new BufferedReader(new InputStreamReader(gzip));
br.readLine();
答案 2 :(得分:3)
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);
答案 3 :(得分:0)
您可以在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;
}
答案 4 :(得分:0)
这是一行
try (BufferedReader br = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz"))))) {br.readLine();}