Java NIO2: требуется разъяснение по FileChannel

Я пытаюсь создать собственный FileChannel, и я испытываю недостаток ясности из-за несоответствия в документации.

Документация для FileChannel.transferFrom(ReadableByteChannel src, long position, long count) говорит,

Если заданная позиция больше текущего размера файла, байты не передаются.

Теперь, разве они не должны были сказать это вместо этого? :

«Если position + count больше текущего размера файла, то байты не передаются».

Причина, по которой я подозреваю, что это может быть ошибка в документации, заключается в следующем. В другом месте того же документа API, если файлу необходимо увеличиться, делается явное упоминание об этом, как в случае FileChannel.write(ByteBuffer src, long position):

«Если заданная позиция больше текущего размера файла, файл будет увеличен, чтобы вместить новые байты»;

Таким образом, если не упоминалось о росте файла в случае FileChannel.transferFrom(), у меня создалось впечатление, что файл не должен увеличиваться с помощью этого метода. Но проблема в том, что файл может увеличиваться не только "если заданная позиция больше текущего размера файла", но и "если position + count больше текущего размера файла" .


person Harry    schedule 17.11.2013    source источник


Ответы (1)


Тот же документацию, как вы:

Будет передано меньше запрошенного количества байтов, если в исходном канале осталось меньше, чем count байтов, или если исходный канал является неблокирующим и имеет меньше, чем count байтов, непосредственно доступных во входном буфере.

И почему TransferFrom должен расширять ReadableBiteChannel?

Итак: Нет

Редактировать 1:

«Если позиция + количество больше текущего размера файла, байты не передаются».

Значит это:

Path sourcePath = Paths.get("C:/FileChannelDemo/source.txt");
Path targetPath = Paths.get("C:/FileChannelDemo/target.txt");

Files.createDirectories(sourcePath.getParent());

BufferedWriter writer = Files.newBufferedWriter(sourcePath,
        StandardCharsets.UTF_8);

// 200k
while (Files.size(sourcePath) < 200 * 1024)
    writer.write(System.currentTimeMillis() + "\n");

FileChannel src = FileChannel.open(sourcePath, StandardOpenOption.READ);

FileChannel trgt = FileChannel.open(targetPath, EnumSet.of(StandardOpenOption.WRITE, 
        StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING));

int count = 200*1024;

System.out.println("current size is: " + Files.size(targetPath) + "smaller than  count:" +count);

trgt.transferFrom(src, 0, count);

не будет передавать никаких данных. Но это так.

Причины, по которым не следует передавать countбайта, указаны выше.

person Franz Ebner    schedule 02.01.2014
comment
Мой вопрос касается пункта назначения FileChannel, для которого вызывается transferFrom... куда пойдут байты из источника. Я не ищу разъяснений на исходном канале. - person Harry; 03.01.2014
comment
@Гарри, надеюсь, это поможет - person Franz Ebner; 14.01.2014