Java:多个线程同时读取同一InputStream

时间:2018-07-28 03:34:39

标签: java multithreading inputstream fileinputstream

private InputStream inputStream;。现在,我想将inputStream分成10个块,这将返回另外10个InputStream。 10个线程将同时读取10个InputStream。该怎么做?

下面的代码行吗?

BoundedInputStream stream = new BoundedInputStream(inputStream, chunkSize);

1 个答案:

答案 0 :(得分:4)

该代码不符合您的想法。 BoundedInputStream是一种流,它限制了可以从基础流中读取的字节数。但是并没有说要返回哪个字节……如果其他线程也在从底层流中读取

对于从非文件源读取的输入流,将流划分为块的唯一方法是读取整个流,将其写入可以分块的对象,然后在块上打开单独的输入流。

如果源是文件,则可以打开多个独立的输入流,使用seek或同等功能跳到所需位置并读取。例如(基于source):

public InputStream chunkInputStream(File file, int pos, int count) {
    RandomAccessFile raf = new RandomAccessFile(file, "r");
    BoundedInputStream res = new BoundedInputStream(
         Channels.newInputStream(raf.getChannel().position(pos)), 
         count);
    //  res.setPropagateClose(false) ;  // INCORRECT!
    return res ;
} 

实际上,您可以避免使用RandomAccessFile并这样做:

public InputStream chunkInputStream(File file, int pos, int count) {
    FileChannel channel = FileChannel.open(file, READ);
    return new BoundedInputStream(
         Channels.newInputStream(channel.position(pos)), 
         count);
}

...但是区别纯粹是表面上的。