Чтение / запись в linux Pipe с использованием Java - PullRequest
8 голосов
/ 27 октября 2009

Мой вопрос о том, каков наилучший способ чтения / записи в linux Pipe на Java? Я уже использую java.io.RandomAccessFile, например

   RandomAccessFile file = new RandomAccessFile("/dev/zap/16", "rw");

и затем передает его в рабочий поток, который читает каждые 2 мсек как

  byte[] buffer = new byte[16];
  file.read(buffer);

Он читает его из Pipe, но я подозреваю, что некоторые байты перезаписаны. Знаете ли вы, как Linux (Ubuntu) обрабатывает буфер для канала?

Ответы [ 3 ]

11 голосов
/ 27 октября 2009

Я никогда не пробовал это сам, но то, что ты делаешь, кажется неправильным. Каналы Linux являются «первым пришел - первым вышел» (FIFO) по определению. Следовательно, вы должны иметь возможность читать байты только в том порядке, в котором вы их записали, а не в случайном порядке. Я бы предложил вместо этого использовать обычный File, и он должен работать нормально.

6 голосов
/ 27 октября 2009

Насколько я знаю, трубы не обрабатываются каким-либо особым образом в Java. Вы просто открываете файл для записи и пишете в него.

Вы не можете «перезаписать» что-либо в трубе, поскольку вы не можете искать в трубе. По той же причине RandomAccessFile не самый разумный выбор для использования (поскольку канал явно не файл произвольного доступа). Я бы предложил вместо этого использовать FileOutputStream.

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

0 голосов
/ 27 октября 2009

Я думаю, что вы не можете сбрасывать после записи, поэтому выполняйте OutputStream.flush () часто, и чтение может занимать байт за раз, по крайней мере, чтобы увидеть, проходят ли ваши данные. например чтобы начать с открытия именованного канала в режиме только для чтения (FileInputStream) в process1, откройте его в режиме записи (FileOutputStream) в process2, чтобы все, что вы пишете в process2, было прочитано в process1.

также читайте

http://www.tldp.org/LDP/lpg/node15.html
http://www.unixguide.net/unix/programming/2.10.5.shtml http://www.unixguide.net/unix/programming/2.10.6.shtml

...