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

我创建了一个适用于FLV文件的Web应用程序。

此应用程序使用我创建的库来解析flv文件中的内容。 该库使用FileChannel来搜索文件。

我现在遇到一种奇怪的行为,因为我从不同的线程中寻找相同的flv文件。 假设Thread_1Thread_2都在同时寻找movie.flv (我的问题在示例之后)。

Thread_1

// Thread_1 moves to position 200 to read something FileChannel chan1 = new FileInputStream("movie.flv").getFileChannel(); chan1.position(200); 

Thread_2 (在Thread_1之后执行)

 // Thread_2 moves to position 600 to read something else FileChannel chan2 = new FileInputStream("movie.flv").getFileChannel(); chan2.position(600); 

最后Thread_1做了:

 ByteBuffer bb = ByteBuffer.allocate(40); chan1.read(bb); 

Thread_1是从位置200还是从位置600读取40个字节? 更准确地说, chan1chan2是否独立(=可以独立寻找)通道?

从文档中我读到FileChannel是唯一的 ,所以我的赌注(不幸的是)在示例中Thread_1将从位置600读取:

在这种情况下,你能建议一种不同的方法来独立于不同的线程寻找文件吗?

谢谢!

认为你很好,因为你在两个线程上都创建了一个新的FileInputStream。 链接的文档指出从FileInputStream.getChannel()返回的FileChannel 对于该文件输入流是唯一的。 FileChannel的文档还建议从不同的源(例如,不同的FileInputStream实例)生成的不同FileChannel将不共享状态。

我编写了一个库,它支持在同一个文件中,在不同的线程或不同的进程中编写和读取。 它工作正常(假设流只使用一个线程)

您可能会发现内存映射文件是一种更简单的方式来共享数据,因为整个文件在逻辑上都在内存中。 您可以创建.splice()多个.splice()以在不同位置同时访问它(每个线程一个)。 它也比拨打系统电话快10倍。

FileChannel实例对于它的源流实例是唯一的。 您的示例中有两个不同的FileInputStream实例。 所以我认为他们的渠道不是相互依赖的。