2009-10-30 5 views
1

Voici ma méthode pour ajouter un fichier à un autre fichier.java FileChannel transferFrom des questions?

public static void appendFile(File baseFile, File newFile) throws IOException { 
    long baseFileSize = baseFile.length(); 
    FileChannel outChannel = new FileOutputStream(baseFile).getChannel(); 
    long position1 = outChannel.position(); 
    outChannel.position(baseFileSize); 
    long position2 = outChannel.position(); 
    long baseFileSize2 = baseFile.length(); 
    FileChannel inChannel = new FileInputStream(newFile).getChannel(); 
    System.err.println("appendFile() baseFile=" + baseFile.getAbsolutePath() + 
      ", size=" + baseFileSize + ", size2=" + baseFileSize2 + 
      ", position1=" + position1 + ", position2=" + position2 + 
      ", newFile=" + newFile.getAbsolutePath() + ", size=" + inChannel.size()); 
    try { 
     outChannel.transferFrom(inChannel, baseFileSize, inChannel.size()); 
    } 
    catch (IOException e) { 
     throw e; 
    } 
    finally { 
     if (outChannel != null) outChannel.close(); 
     if (inChannel != null) inChannel.close(); 
    } 
} 

Le résultat est étrange pour moi. Lorsque le fichier baseFile est vide, il copiera le nouveau fichier dans ce fichier baseFile, mais alors que baseFile n'est pas vide, il rendra ce fichier vide au lieu d'ajouter newFile sur celui-ci. Je ne sais pas pourquoi. Définissez la position outChannel sur baseFileSize ou baseFileSize + 1 ne fait aucune différence.

Si le fichier baseFile n'est pas vide, la valeur de la propriété baseFileSize est correcte, mais celle de baseFileSize2 est toujours 0. Je ne sais pas pourquoi.

Quelqu'un peut indiquer ce qui ne va pas ici? Je peux manquer quelque chose. merci,

Répondre

2

Je pense que vous devez dire au FileOutputStream à ajouter (par défaut est Écraser):

FileChannel outChannel = new FileOutputStream(baseFile, true).getChannel(); 
+0

Si elle est écrasera, il ne devrait pas faire le vide BASEFILE. Je vais le tester. – 5YrsLaterDBA

+0

testé, vous avez raison. Merci. – 5YrsLaterDBA