Могу ли я искать файл из разных потоков независимо, используя FileChannel? - PullRequest
4 голосов
/ 03 февраля 2012

Я создал веб-приложение, которое работает с FLV-файлами.

Это приложение использует библиотеку, которую я создал для анализа содержимого файлов 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 читает 40 байтов из позиции 200 или из позиции 600? Точнее, являются chan1 и chan2 независимыми (= могут искать независимо) каналами или нет?

Из документации я прочитал, что FileChannel уникален , поэтому моя ставка (к сожалению) заключается в том, что в примере Thread_1 будет читать с позиции 600: \

В случае, если вы можете предложить другой подход для поиска файла независимо от разных потоков?

спасибо!

Ответы [ 3 ]

3 голосов
/ 03 февраля 2012

Я написал библиотеку, которая поддерживает запись и чтение из одного и того же файла, в разных потоках или в разных процессах. Он работает просто отлично (при условии, что поток используется только одним потоком)

Может показаться, что отображение памяти в файле - это более простой способ обмена данными, поскольку весь файл условно находится в памяти. Вы можете создать несколько .splice() MappedByteBuffer для одновременного доступа к нему в разных местах (по одному на поток). Это также будет в 10 раз быстрее, чем системный вызов.

1 голос
/ 03 февраля 2012

Экземпляр FileChannel уникален для своего экземпляра исходного потока.В вашем примере есть два разных экземпляра FileInputStream.Поэтому я думаю, что их каналы не зависят друг от друга.

0 голосов
/ 03 февраля 2012

I думаю, все в порядке, поскольку вы создаете новый FileInputStream в обоих потоках. В связанной документации говорится, что FileChannel, возвращаемый из FileInputStream.getChannel (), уникален для входного потока этого файла . Документация FileChannel также предполагает, что разные FileChannels, сгенерированные из разных источников (например, разные экземпляры FileInputStream), не будут иметь общего состояния.

...