我可以使用FileChannel独立地从不同的线程中查找文件吗?
我创建了一个适用于FLV文件的Web应用程序。
此应用程序使用我创建的库来解析flv文件中的内容。 该库使用FileChannel来搜索文件。
我现在遇到一种奇怪的行为,因为我从不同的线程中寻找相同的flv文件。 假设Thread_1和Thread_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个字节? 更准确地说, chan1和chan2是否独立(=可以独立寻找)通道?
从文档中我读到FileChannel是唯一的 ,所以我的赌注(不幸的是)在示例中Thread_1将从位置600读取:
在这种情况下,你能建议一种不同的方法来独立于不同的线程寻找文件吗?
谢谢!
我认为你很好,因为你在两个线程上都创建了一个新的FileInputStream。 链接的文档指出从FileInputStream.getChannel()返回的FileChannel 对于该文件输入流是唯一的。 FileChannel的文档还建议从不同的源(例如,不同的FileInputStream实例)生成的不同FileChannel将不共享状态。
我编写了一个库,它支持在同一个文件中,在不同的线程或不同的进程中编写和读取。 它工作正常(假设流只使用一个线程)
您可能会发现内存映射文件是一种更简单的方式来共享数据,因为整个文件在逻辑上都在内存中。 您可以创建.splice()
多个.splice()
以在不同位置同时访问它(每个线程一个)。 它也比拨打系统电话快10倍。
FileChannel实例对于它的源流实例是唯一的。 您的示例中有两个不同的FileInputStream实例。 所以我认为他们的渠道不是相互依赖的。