tags:

views:

46

answers:

1

I'm trying to use NIO to assemble a file out of several smaller files, using transferFrom.

The call to transferFrom returns 0. No exception. Nothing done to turn on synchronous behavior.

    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;

An example log:

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
+2  A: 

The two most obvious answers are:

  1. That tmpT5 points to a zero byte file, or
  2. That the file pointed to by path is less than 4096 bytes long.

From the transferFrom docs:

If the given position is greater than the file's current size then no bytes are transferred.

Paul Wagland
Oh, gosh. I read that three times and got tangled up between the two files. Yes, I was trying to create a sparse file by pointing transferFrom out past the end.
bmargulies