2012-02-03 6 views
4

FLVファイルで動作するWebアプリケーションを作成しました。FileChannelを使用して別のスレッドからファイルを個別に検索できますか?

このアプリケーションでは、flvファイルのコンテンツを解析するために作成したライブラリを使用しています。このライブラリはFileChannelを使用してファイルを検索します。

違うスレッドから同じflvファイルを探すようになりました。 スレッド1スレッド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_1後に実行)

Thread_2

// 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独立した(独立して求めることができる)チャネルはありますか?

\場合は、あなたがお勧めすることができます:私は私の賭けは、(残念ながら)の例ではThread_1は、位置600から読み取るしようとしているされていること、のFileChannelはユニークであることを読んdocumentationから

異なるスレッドから独立してファイルを検索する別のアプローチですか?

ありがとうございました!

答えて

0

私はだと思います。あなたは両方のスレッドで新しいFileInputStreamを作成しているのでいいですね。リンクされたドキュメントでは、FileInputStream.getChannel()から返されたFileChannelがそのファイル入力ストリームに対して一意のであることを示しています。 FileChannelのドキュメントには、さまざまなソース(たとえば、異なるFileInputStreamインスタンス)から生成された異なるFileChannelが状態を共有しないことも示唆されています。

+0

答えに感謝!それが私に必要な情報を正確に与えるので、私はあなたに投票します。 – Giordano

1

FileChannelインスタンスは、ソースストリームインスタンスで一意です。あなたの例には2つの異なるFileInputStreamインスタンスがあります。だから私は彼らのチャネルがお互いに依存していないと思う。

+0

答えに感謝します:) – Giordano

3

私は同じファイルから、異なるスレッドまたは異なるプロセスで書き込みと読み取りをサポートするライブラリを作成しました。ファイルは単なるファイルでしか使えません(ストリームが1つのスレッドでのみ使用されている場合)

ファイルをメモリにマッピングすると、ファイル全体が概念的にメモリに格納されるため、データを簡単に共有できます。 MappedByteBufferの複数の.splice()を作成して、異なる場所で同時にアクセスすることができます(スレッドごとに1つ)。また、システムコールよりも最大10倍高速です。

+0

提案に感謝します。私の場合は、ファイルに同時にアクセスするいくつかのスレッドがあります(読み取りモードで)。私はスプライス()についても確実に見ていきます。ありがとうございました! – Giordano

関連する問題