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

标签 java multithreading inputstream fileinputstream

私有(private)InputStream inputStream;。现在,我想将 inputStream 分成 10 个 block ,这会返回另外 10 个 InputStream。 10个线程会同时读取10个InputStream。如何做到这一点?

下面这段代码可以工作吗?

BoundedInputStream stream = new BoundedInputStream(inputStream, chunkSize);

最佳答案

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

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

如果源是文件,您可以打开多个独立的输入流,使用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);
}

...但差异纯粹是表面上的。

关于Java:多个线程同时读取同一个InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51567795/

相关文章:

java - 如何使用不可变对象(immutable对象)解决两个编写器的竞争条件

java - 将 InputStream 转换为 byte[] 的最有效方法?

java - 我们可以在 Java 中将字节数组转换为 InputStream 吗?

java - 在 Java 中保存和加载

java - 在服务器集群上部署 Java 应用程序的最佳方式?

java - 在 JavaFX 中使用 JavaScript 调用 java。是否可以?

c++ - std::atomic_store 和 std::atomic_exchange 不交换

java - 为什么类被视为引用类型?

java - 检测线程是否排队/过度工作

java - 使用 REST API 下载文件