IT TIP

GZIPInputStream 한 줄씩 읽기

itqueen 2020. 10. 13. 20:00
반응형

GZIPInputStream 한 줄씩 읽기


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

여기는 한 줄입니다

try (BufferedReader br = new BufferedReader(
        new InputStreamReader(
           new GZIPInputStream(
              new FileInputStream(
                 "F:/gawiki-20090614-stub-meta-history.xml.gz"))))) 
     {br.readLine();}

참고 URL : https://stackoverflow.com/questions/1080381/gzipinputstream-reading-line-by-line

반응형