Tenho um arquivo no formato .gz. A classe java para ler este arquivo é GZIPInputStream. No entanto, essa classe não estende a classe BufferedReader de java. Como resultado, não consigo ler o arquivo linha por linha. Eu preciso de algo assim
reader = new MyGZInputStream( some constructor of GZInputStream)
reader.readLine()...
Pensei em criar minha classe que estende a classe Reader ou BufferedReader de java e use GZIPInputStream como uma de suas variáveis.
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);
}
}
Mas, isso não funciona quando eu uso
BufferedReader in = new BufferedReader(
new MyGZFilReader("F:/gawiki-20090614-stub-meta-history.xml.gz"));
System.out.println(in.readLine());
Alguém pode aconselhar como proceder ..
java
file-io
filereader
gzipinputstream
Kapil D
fonte
fonte
Respostas:
A configuração básica dos decoradores é assim:
InputStream fileStream = new FileInputStream(filename); InputStream gzipStream = new GZIPInputStream(fileStream); Reader decoder = new InputStreamReader(gzipStream, encoding); BufferedReader buffered = new BufferedReader(decoder);
A questão chave neste trecho é o valor de
encoding
. Esta é a codificação de caracteres do texto no arquivo. É "US-ASCII", "UTF-8", "SHIFT-JIS", "ISO-8859-9",…? existem centenas de possibilidades e a escolha correta geralmente não pode ser determinada a partir do próprio arquivo. Deve ser especificado por meio de algum canal fora da banda.Por exemplo, talvez seja o padrão da plataforma. Em um ambiente de rede, no entanto, isso é extremamente frágil. A máquina que escreveu o arquivo pode estar no cubículo vizinho, mas tem uma codificação de arquivo padrão diferente.
A maioria dos protocolos de rede usa um cabeçalho ou outros metadados para observar explicitamente a codificação de caracteres.
Nesse caso, parece, pela extensão do arquivo, que o conteúdo é XML. O XML inclui o atributo "encoding" na declaração XML para esse propósito. Além disso, o XML deve realmente ser processado com um analisador XML, não como texto. Ler XML linha por linha parece um caso especial frágil.
Deixar de especificar explicitamente a codificação vai contra o segundo mandamento. Use a codificação padrão por sua conta e risco!
fonte
GZIPInputStream gzip = new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz")); BufferedReader br = new BufferedReader(new InputStreamReader(gzip)); br.readLine();
fonte
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);
fonte
Você pode usar o seguinte método em uma classe de utilitários e sempre que necessário ...
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; }
fonte
aqui está com uma linha
try (BufferedReader br = new BufferedReader( new InputStreamReader( new GZIPInputStream( new FileInputStream( "F:/gawiki-20090614-stub-meta-history.xml.gz"))))) {br.readLine();}
fonte