【发布时间】:2012-07-09 18:06:57
【问题描述】:
我正在使用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();
}
}
【问题讨论】:
-
为什么要使用 anything? 请看我的回答。在阅读文件时解析文件。
-
@EJP 的评论和回答很到位。不过,作为实际代码的旁注,您不能忽略
InputStream.read()的返回值——它非常很重要。另外,你需要展示你的阅读代码(你怎么知道文件之间的边界?)。