문제

.gz 형식의 파일이 있습니다. 이 파일을 읽기위한 Java 클래스는 gzipinputstream입니다. 그러나이 클래스는 Java의 BufferedReader 클래스를 확장하지 않습니다. 결과적으로 파일을 한 줄씩 읽을 수 없습니다. 나는 이런 것이 필요하다

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

나는 독자 또는 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());

누군가가 진행하는 방법에 조언 할 수 있습니까 ..

도움이 되었습니까?

해결책

데코레이터의 기본 설정은 다음과 같습니다.

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 라인별로 읽는 것은 깨지기 쉬운 특별한 경우처럼 보입니다.

인코딩 IS를 명시 적으로 지정하지 못한다 두 번째 계명에 대하여. 위험에 대한 기본 인코딩을 사용하십시오!

다른 팁

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

여기에 한 줄이 있습니다

try (BufferedReader br = new BufferedReader(
        new InputStreamReader(
           new GZIPInputStream(
              new FileInputStream(
                 "F:/gawiki-20090614-stub-meta-history.xml.gz"))))) 
     {br.readLine();}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top