| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > беда сRandomAccessFile.writeInt |
| Автор: _hunter 16.8.2012, 21:39 |
| Добрый вечер, Помогите со странной проблемой: пишу в pipe с помощью RandomAccessFile.writeInt: RandomAccessFile pipe = new RandomAccessFile("\\\\.\\pipe\\rmserverpipe", "rws"); pipe.writeInt(0xABCDEF12); запись проходит "нормально" -- exception не бросается. Но "на другом конце" (читаю в "плюсах") из pipe'а вычитывается только один байт. Повторная "вычитка" дочитывает остальные три байта... На чтении все банально: result = ::ReadFile(pipe, &data, 4, &bytesRead, NULL); и при "плюсовой" записи все вычитывается за один раз. Соответственно вопрос: как "это" бороть? С уважением... |
| Автор: leniviy 16.8.2012, 22:00 | ||
Я считаю, это норма. Даже если удастся побороть в данном случае, всё равно будет ненадежно. Так что надо ReadFile вызывать в цикле. И вообще инты надо передавать в network byte order.
|
| Автор: _hunter 16.8.2012, 22:08 |
| Как это "норма"? -- Справка: http://docs.oracle.com/javase/1.4.2/docs/api/java/io/RandomAccessFile.html#writeInt(int) , вроде как, говорит что писаться должно четыре байта. Причем, почему-то, нет никаких механизмов контроля записи... "Принимающее" приложение переписывать -- не вариант: оно уже работает и лезть туда никто не даст... |
| Автор: leniviy 16.8.2012, 22:17 | ||||
Могу сделать предположение: жаба конвертит int в байт массив из 4 байт, меняет байты местами, и по-одному пишет в поток. Винда успевает отправить первый байт, в это время буфер пайпа заполняется 3 оставшимися байтами. Есть: IOException. баг в приложении. Добавлено через 5 минут и 40 секунд Во:
Добавлено через 9 минут и 30 секунд Попробуй так, но это из разряда ненадежных
|