Я не знаю, где искать пояснения и подтверждения в документации Java API и Java-коде, поэтому я делаю это здесь.
В документации API для FileChannel
я обнаруживаю ошибки "один за другим" w.r.t. для файла position
и файла size
в большем количестве мест, чем один.
Вот только один пример. Документация API для transferFrom(...)
гласит:
"Если заданная позиция больше, текущий текущий размер, тогда никакие байты не передаются."
Я подтвердил, что код OpenJDK тоже содержит этот код...
public long transferFrom(ReadableByteChannel src, long position, long count)
throws IOException
{
// ...
if (position > size())
return 0;
// ...
}
... в файле FileChannelImpl.java
в соответствии с документацией.
Теперь, хотя приведенный выше фрагмент кода и документация API выглядят взаимно согласованными, я чувствую, что выше должно быть 'больше или равно', а не просто 'больше, чем ', потому что position
является индексом, основанным на 0, в данных файла, при чтении в position == size()
не будет данных для возврата к вызывающему абоненту! (В position == size() - 1
не менее 1 байт - последний байт файла - может быть возвращен вызывающему абоненту.)
Вот несколько других подобных примеров на одной странице документации API:
-
position(...)
: "Установив позицию в значение больше, текущий размер файла является законным, но делает не изменяйте размер файла." (Должно быть "больше или равно" .) -
transferTo(...)
: "Если заданная позиция больше, текущий размер файла не передается, то никакие байты не передаются". (Должно быть "больше или равно" .) -
read(...)
: "Если заданная позиция больше, текущий размер файла, то никакие байты не читаются". (Должно быть "больше или равно" .)
Наконец, раздел документации для возвращаемого значения read(...)
не может оставаться даже самосогласованным с остальной частью документации. Вот что он говорит:
Возврат:
Число прочитанных байтов, возможно, ноль или -1, если заданная позиция больше или равна размер текущего файла
Итак, в этом одиночном случае я вижу, что они упоминают правильную вещь.
В целом я не знаю, что из этого сделать. Если я напишу свой код сегодня, соответствующий этой документации, тогда исправление в будущем ошибки в Java (код или документация) сделает мой код ошибкой, требуя исправления и с моей стороны. Если я сам положу себя сегодня с вещами, которые стоят сегодня, тогда мой код станет багги для начала!