2010-01-23 5 views
1

J'essaie d'utiliser NIO pour assembler un fichier à partir de plusieurs fichiers plus petits, en utilisant transferFrom.nio FileChannel.transferFrom en cours de transfert 0?

L'appel à transferFrom renvoie 0. Aucune exception. Rien n'a été fait pour activer le comportement synchrone.

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; 

Un exemple journal:

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 
+0

Quelle était la sortie de la première instruction de journal? – skaffman

+0

@skaffman pourrait-il être que cela ne traite pas des fichiers clairsemés? – bmargulies

+0

Hmm. 'progressOffset' est mis à 4096, et n'a jamais changé (qu'après le transferFrom()), pourtant vos instructions de log l'ont imprimé 15024620. Je suspecte qu'il y ait une boucle manquante quelque part? –

Répondre

2

Les deux réponses les plus évidentes sont:

  1. Ce point tmpT5 à un fichier zéro octet, ou
  2. Que le fichier pointé par Le chemin est inférieur à 4096 octets.

Des transferFrom docs:

Si la position donnée est supérieure à la taille actuelle du fichier, pas d'octets sont transférés.

+0

Oh, ça alors. J'ai lu ça trois fois et je me suis emmêlé entre les deux fichiers. Oui, j'essayais de créer un fichier clairsemé en pointant transferFrom après la fin. – bmargulies