Java パイプラインを使用して、解凍モジュール (JavaUncompress クラス) から解析モジュール (ハンドラー クラス) にデータ (アウトストリーム) を渡しています。ファイルが大きいため、最初にファイルを解凍し、解凍したファイルを保存する代わりに直接解析したいそして解析します。ただし、小さいサイズのファイルに対してのみ機能します。1G ファイルを入力すると、ファイルの一部 (たとえば 50000 行) だけが出力ストリームから解析モジュールの入力ストリームにパイプライン化されているようです。
非圧縮ファイルを保存するために文字列を使用しようとしましたが、同じことが起こりました.文字列には解凍されたファイルの一部しか含まれていません(パイプライン化されたバージョンと同じ50000行目で停止しました)。何が起こったのかについて何か考えはありますか?どうもありがとうございました。
パイプラインのコードは次のとおりです。
{
PipedInputStream in = new PipedInputStream(); // to output
final PipedOutputStream out = new PipedOutputStream(in); // out is something from other
new Thread(
new Runnable(){
public void run(){
JavaUncompress.putDataOnOutputStream(inFile,out); }
}
).start();
doc = handler.processDataFromInputStream(in);
}
public static void putDataOnOutputStream(String inZipFileName, PipedOutputStream out){
try {
FileInputStream fis = new FileInputStream(inZipFileName);
//FilterInputStream ftis = new FilterInputStream;
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
while((entry = zis.getNextEntry()) != null) {
System.out.println("Extracting: " +entry);
byte data[] = new byte[BUFFER];
long len = entry.getSize();
long blk = len/BUFFER;
int rem = (int)(len - blk*BUFFER);
System.out.println(len+" = "+blk +"*BUFFER + "+rem);
for(long i=0; i!=blk; ++i){
if ((zis.read(data, 0, BUFFER)) != -1) {
out.write(data);
}
}
byte dataRem[] = new byte[rem];
if ((zis.read(dataRem, 0, rem)) != -1) {
out.write(dataRem);
out.flush();
out.close();
}
}
zis.close();
} catch(Exception e) {
e.printStackTrace();
}
}