2017-11-25 16 views
0

위키 백과 사전을 자바에서 URL에서 직접 파싱하려고합니다. ,URL 스트림에서 전체 압축 파일을 읽을 수없는 이유는 무엇입니까?

String fileURL = "https://dumps.wikimedia.org/cswiktionary/20171120/cswiktionary-20171120-pages-articles-multistream.xml.bz2"; 
URL bz2 = new URL(fileURL); 
BufferedInputStream bis = new BufferedInputStream(bz2.openStream()); 
CompressorInputStream input = new CompressorStreamFactory().createCompressorInputStream(bis); 
BufferedReader br2 = new BufferedReader(new InputStreamReader(input)); 
System.out.println(br2.lines().count()); 

그러나, 출력 된 라인 수는 전체 파일의 일부분 만 인 만 36 : 위키 덤프 압축 BZIP2 파일로 배포하고 있으며, 내가 그들을 구문 분석을 시도하기 위해 다음과 같은 방법을 사용하고 있습니다 20MB가 넘는 크기입니다. 스트림 라인 별을 인쇄하려고하면, XML의 몇 줄이 실제로 인쇄 된 :

String line = br2.readLine(); 
while(line != null) { 
    System.out.println(line); 
    line = br2.readLine(); 
} 

내가 여기에 놓친 거지 뭔가가 있나요? 필자는 온라인에서 찾은 다른 코드 덩어리에서 구현 된 내용을 거의 한 줄씩 다른 사람이 복사했다고 주장했습니다. 전체 스트림을 읽지 않는 이유는 무엇입니까? 미리 감사드립니다.

답변

2

그래서 밝혀 졌을 때, 나는 단지 바보 같았습니다. Wiktionary BZIP2 파일은 명시 적으로 멀티 스트림입니다 (파일 이름에서도 마찬가지입니다). 결과적으로 바닐라 Commons Compress 클래스를 사용하여 하나의 스트림 만 읽었습니다. 다중 스트림 파일을 읽으려면 멀티 스트림 판독기가 필요하며 사물에서 직접 작성해야합니다.

https://chaosinmotion.blog/2011/07/29/and-another-curiosity-multi-stream-bzip2-files/

희망이 미래에 누군가 :)

을하는 데 도움이 : 나는 나를 위해 일한 다음 구현에 걸쳐 발생