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
'IT TIP' 카테고리의 다른 글
오류 : 'int'유형의 rvalue에서 'int &'유형의 상수가 아닌 참조를 잘못 초기화했습니다. (0) | 2020.10.13 |
---|---|
문자열의 특수 문자를 _ (밑줄)로 바꿉니다. (0) | 2020.10.13 |
GAC에서 .NET DLL 파일을 어떻게 등록합니까? (0) | 2020.10.13 |
기본 사용자 이름 및 비밀번호 인증으로 squid 프록시를 설정하는 방법은 무엇입니까? (0) | 2020.10.13 |
배열에서 요소를 무작위로 선택하는 방법 (0) | 2020.10.13 |