nio FileChannel.transfer от передачи 0? - PullRequest
1 голос
/ 23 января 2010

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

Вызов TransferFrom возвращает 0. Нет исключения. Ничего не сделано для включения синхронного поведения.

    FileOutputStream fos = new FileOutputStream(path);
    FileChannel fileBeingAssembled = fos.channel();
    int progressiveOffset = 4096;
    FileInputStream fis = new FileInputStream(tmpT5);
    FileChannel channel = fis.getChannel();
    channel.position(0);
    int thisItemLength = (int)channel.size();
    LOG.info("Writing " + tag + " at " + progressiveOffset + " length " + thisItemLength);
    fileBeingAssembled.position(progressiveOffset);
    long x = fileBeingAssembled.transferFrom(channel, progressiveOffset, thisItemLength);
    LOG.info("transferred " + x);
    progressiveOffset += thisItemLength;

Пример журнала:

4409 [main] INFO  com.basistech.seg.writing.ModelOutputTask  - available 1856216
4409 [main] INFO  com.basistech.seg.writing.ModelOutputTask  - Writing word at 15024620 length 1856216
4419 [main] INFO  com.basistech.seg.writing.ModelOutputTask  - transferred 0

1 Ответ

2 голосов
/ 23 января 2010

Два наиболее очевидных ответа:

  1. что tmpT5 указывает на файл нулевого байта, или
  2. что файл, на который указывает путь, имеет длину менее 4096 байт.

Из TransferFrom документов:

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

...