2009-07-03 2 views
61

.gz 형식의 파일이 있습니다. 이 파일을 읽기위한 Java 클래스는 GZIPInputStream입니다. 그러나이 클래스는 Java의 BufferedReader 클래스를 확장하지 않습니다. 따라서 파일을 한 줄씩 읽을 수 없습니다. 나는 Reader 또는 자바의의 BufferedReader 클래스를 확장하고 그 변수의 하나로서 GZIPInputStream을 사용하여 내 수업을 만들 생각이GZIPInputStream 줄 단위로 읽기

reader = new MyGZInputStream(some constructor of GZInputStream) 
reader.readLine()... 

같은 I가 필요합니다.

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

이 링크를보세요. http://stackoverflow.com/q/6717165/779408. 압축 및 압축 해제 방법이 여기에 표시됩니다. – breceivemail

+0

이 세상에서 선하고 옳은 모든 것의 사랑과 보람있는 코드를 작성하는 개발자의 온전함을 위해서 ..... @ERickson 포인트 인코딩으로 알아 두십시오! 그는 이것을 지적한 유일한 대답으로, 나는 울기를 원한다. – James

답변

114

장식의 기본 설정은 다음과 같이이다 :

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", & hellip; 수백 가지 가능성이 있으며 올바른 선택은 대개 파일 자체에서 결정할 수 없습니다. 일부 대역 외 채널을 통해 지정해야합니다.

예를 들어 플랫폼 기본값 일 수 있습니다. 그러나 네트워크 환경에서는 매우 취약합니다. 파일을 작성한 머신은 인접한 칸막이에 앉아 있지만 다른 기본 파일 인코딩을 가질 수 있습니다.

대부분의 네트워크 프로토콜은 헤더 또는 기타 메타 데이터를 사용하여 문자 인코딩을 명시 적으로 나타냅니다.

이 경우 파일 확장자에서 내용이 XML 인 것으로 나타납니다. XML은이 목적을 위해 XML 선언에 "인코딩"속성을 포함합니다. 또한 XML은 텍스트가 아닌 XML 파서로 처리해야합니다. XML을 한 줄씩 읽는 것은 깨지기 쉬운 특별한 경우처럼 보입니다.

명시 적으로 인코딩을 지정하지 못했습니다. 위험 할 때 기본 인코딩을 사용하십시오!

+1

덕분에 성공했습니다 ... 그러나 리더 단계가 필요 없습니다 ... GZIPInputStream gzip = new GZIPInputStream (새 FileInputStream ("F : /gawiki-20090614-stub-meta-history.xml. gz ")); \t \t BufferedReader br = new BufferedReader (새 InputStreamReader (gzip)); –

+12

@ KapilD 그것은 당신이 코멘트에 대한 귀하의 코멘트와 예제에서 보여 주듯이, 당신이 인코딩에 대한 그의 요점을 완전히 놓쳤다는 것을 저를 슬프게 만듭니다.에릭슨의 대답을 다시 읽으십시오. 아마 30 번 이상. – James

+0

gzip 명령은 인코딩을 어떻게 알 수 있습니까? 전 세계의 많은 리눅스/유닉스 서버에서 많은 파일을 읽고 싶습니다 ... 그래서 저는 이걸 올바르게하고 싶습니다 ... 글은 파일 자체로 인코딩을 결정할 수 없다고 언급하고 있습니다. ...하지만 gzip -d 명령은 별도의 입력없이 모든 파일에서 작동하는 것처럼 보입니다. (현재 사용하고 있지만 회피하고 싶습니다.) 그래서 gzip이 인코딩을 알고 있는지 알아낼 수 있다면 알아낼 수 있습니다. 같은 일을 할 수 있습니다. 어떤 생각이나 제안이라도 누구든지 올바른 방향으로 나를 가리킬 수 있습니까? – glyphx

0

무엇에 대해 :

GZIPInputStream zipReader = new GZIPInputStream(); 
InputStreamReader streamReader = new InputStreamReader(zipReader); 
BufferedReader bufferedReader = new BufferedReader(streamReader); 
34
GZIPInputStream gzip = new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz")); 
BufferedReader br = new BufferedReader(new InputStreamReader(gzip)); 
br.readLine(); 

+0

귀하의 답변은 훌륭합니다. 짧고 간결한 .. 그러나, 에릭슨의 대답은 더욱 자세합니다. –

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);