ラインによってGZIPInputStreamの読み取りライン
-
22-08-2019 - |
質問
私は.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;
}
ここでは1行である。
try (BufferedReader br = new BufferedReader(
new InputStreamReader(
new GZIPInputStream(
new FileInputStream(
"F:/gawiki-20090614-stub-meta-history.xml.gz")))))
{br.readLine();}