Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以使用FileChannel从不同线程独立地查找文件吗?_Java_Multithreading_File Io_Nio - Fatal编程技术网

Java 我可以使用FileChannel从不同线程独立地查找文件吗?

Java 我可以使用FileChannel从不同线程独立地查找文件吗?,java,multithreading,file-io,nio,Java,Multithreading,File Io,Nio,我创建了一个处理FLV文件的web应用程序 这个应用程序使用我创建的库来解析flv文件中的内容。此库使用FileChannel查找文件 我正在经历一个奇怪的行为,现在我从不同的线程中寻找相同的flv文件。假设线程1和线程2都在同时寻找电影.flv(我的问题在示例之后) 线程1 // Thread_1 moves to position 200 to read something FileChannel chan1 = new FileInputStream("movie.flv&quo

我创建了一个处理FLV文件的web应用程序

这个应用程序使用我创建的库来解析flv文件中的内容。此库使用FileChannel查找文件

我正在经历一个奇怪的行为,现在我从不同的线程中寻找相同的flv文件。假设线程1线程2都在同时寻找电影.flv(我的问题在示例之后)

线程1

// Thread_1 moves to position 200 to read something
FileChannel chan1 = new FileInputStream("movie.flv").getFileChannel();
chan1.position(200);
// Thread_2 moves to position 600 to read something else
FileChannel chan2 = new FileInputStream("movie.flv").getFileChannel();
chan2.position(600);
线程2(在线程1之后执行)

最后,线程_1执行以下操作:

ByteBuffer bb = ByteBuffer.allocate(40);
chan1.read(bb);
线程1是从位置200读取40字节还是从位置600读取40字节? 更准确地说,通道1和通道2是否独立(=可以独立搜索)通道

从中,我了解到FileChannel是唯一的,因此我(不幸地)打赌在示例中线程_1将从位置600读取:\

在这种情况下,您可以建议一种不同的方法来独立于不同的线程来查找文件吗


谢谢

FileChannel实例对于其源流实例是唯一的。在您的示例中有两个不同的FileInputStream实例。因此,我认为它们的通道并不相互依赖。

我认为您很好,因为您正在两个线程上创建一个新的FileInputStream。链接文档指出,从FileInputStream.getChannel()返回的FileChannel与该文件输入流是唯一的。
FileChannel的文档还表明,从不同来源生成的不同FileChannel(例如,不同的FileInputStream实例)将不会共享状态。

我编写了一个库,它支持在不同线程或不同进程中从同一文件写入和读取。它工作得很好(只要流仅由一个线程使用)


您可能会发现,内存映射文件是共享数据的一种更简单的方法,因为整个文件名义上都在内存中。您可以创建MappedByteBuffer的多个
.splice()
,以便在不同的位置同时访问它(每个线程一个)。它也将比系统调用快10倍。

谢谢您的建议。然而,在我的例子中,有几个线程同时访问文件(在读取模式下)。我还将在splice()上确定查看。谢谢,投票吧!谢谢你的回答!我投你的票,因为它给了我所需要的信息。