Поведение FileChannel для RandomAccessFile - PullRequest
0 голосов
/ 21 октября 2010

У меня есть один вариант использования, когда мои несколько потоков записывают данные в один и тот же файловый канал (объединяются), и каждый поток имеет смещение в файле, с которого они могут начать запись, до длины данных, которые будут записаны.Поэтому, когда я запрашиваю канал файла из пула, он открывает канал в режиме «rw», если он уже не открыт, и возвращает этот канал файла (открытый файл может быть новым файлом, то есть size = 0), иначе он вернет кешированный канал.,Проблема в том, что поток может записывать данные ни в каком конкретном случае, то есть поток со смещением 1 000 000 может начать запись до потока со смещением 0. Предположим, я открыл новый файл (размер = 0), а поток со смещением = 1 000 000 начинает запись данных (используяwrite(buffer, position) API) перед потоком со смещением = 0.

Мой первый вопрос: разрешено ли это вообще, или я получу какое-то исключение? Во-вторых, если это разрешено: что является гарантией того, что мои данные записаны правильно.В третьих.Когда мой (смещение = 1 000 000) будет завершен с записью в файл, каким будет содержимое в пустом пространстве (0-999 999).Как операционная система будет выделять это промежуточное пространство?

1 Ответ

2 голосов
/ 21 октября 2010

На самом деле не пытаясь описать то, что вы описываете, вот обоснованное предположение:

Первый вопрос: FileChannel является поточно-ориентированным и документирован для расширения размера файла по мере необходимости («Размер файла увеличивается, когдабайты записаны за пределами его текущего размера "), поэтому я думаю, что это будет разрешено.

Второй вопрос: нет никаких гарантий, что ваши данные правильно записаны;это полностью зависит от вашего мастерства программиста.:)

Третий вопрос: я ожидал бы, что содержимое байта «пустого пространства» будет зависеть от ОС, но вы могли бы написать простую программу, чтобы проверить это достаточно легко.

...