gpt4 book ai didi

Java PipedInputStream PipedOutputStream 大小限制

转载 作者:行者123 更新时间:2023-12-01 14:19:42 25 4
gpt4 key购买 nike

我正在使用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();
}
}

最佳答案

PipedOutputStream.write() 将在相应的 PipedInputStream 超过 4096 或后面的任何字节时阻塞,但为什么要这样做呢?为什么不解压缩文件并在同一个线程中处理它呢?多线程处理它没有任何优势,它只是一个毫无意义的复杂化。

我在 Java 中每 15 年只使用过一次管道,我很快就将其更改为队列。

关于Java PipedInputStream PipedOutputStream 大小限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11400604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com