Mam plik w formacie .gz. Klasą Java do odczytu tego pliku jest GZIPInputStream. Jednak ta klasa nie rozszerza klasy BufferedReader języka java. W rezultacie nie mogę odczytać pliku wiersz po wierszu. Potrzebuję czegoś takiego
reader = new MyGZInputStream( some constructor of GZInputStream)
reader.readLine()...
Pomyślałem o stworzeniu mojej klasy, która rozszerza klasę Reader lub BufferedReader java i używa GZIPInputStream jako jednej z jej zmiennych.
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);
}
}
Ale to nie działa, gdy używam
BufferedReader in = new BufferedReader(
new MyGZFilReader("F:/gawiki-20090614-stub-meta-history.xml.gz"));
System.out.println(in.readLine());
Czy ktoś może doradzić, jak postępować ...
java
file-io
filereader
gzipinputstream
Kapil D
źródło
źródło
Odpowiedzi:
Podstawowa konfiguracja dekoratorów wygląda następująco:
InputStream fileStream = new FileInputStream(filename); InputStream gzipStream = new GZIPInputStream(fileStream); Reader decoder = new InputStreamReader(gzipStream, encoding); BufferedReader buffered = new BufferedReader(decoder);
Kluczową kwestią w tym fragmencie jest wartość
encoding
. To jest kodowanie znaków tekstu w pliku. Czy jest to „US-ASCII”, „UTF-8”, „SHIFT-JIS”, „ISO-8859-9”,…? możliwości są setki, a właściwego wyboru zwykle nie można określić na podstawie samego pliku. Musi być określony przez jakiś kanał pozapasmowy.Na przykład, może jest to domyślna platforma. Jednak w środowisku sieciowym jest to niezwykle delikatne. Maszyna, która zapisała plik, może znajdować się w sąsiednim boksie, ale ma inne domyślne kodowanie pliku.
Większość protokołów sieciowych używa nagłówka lub innych metadanych, aby wyraźnie zaznaczyć kodowanie znaków.
W tym przypadku z rozszerzenia pliku wynika, że zawartość to XML. XML zawiera w tym celu atrybut „encoding” w deklaracji XML. Ponadto XML powinien być naprawdę przetwarzany za pomocą parsera XML, a nie jako tekst. Czytanie XML wiersz po wierszu wydaje się delikatnym, specjalnym przypadkiem.
Brak wyraźnego określenia kodowania jest sprzeczny z drugim przykazaniem. Używaj domyślnego kodowania na własne ryzyko!
źródło
GZIPInputStream gzip = new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz")); BufferedReader br = new BufferedReader(new InputStreamReader(gzip)); br.readLine();
źródło
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);
źródło
Możesz użyć następującej metody w klasie util i używać jej w razie potrzeby ...
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; }
źródło
tutaj jest z jedną linią
try (BufferedReader br = new BufferedReader( new InputStreamReader( new GZIPInputStream( new FileInputStream( "F:/gawiki-20090614-stub-meta-history.xml.gz"))))) {br.readLine();}
źródło