我正在使用java管道将数据(outstream)从解压缩模块(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();
}
}