Comment utiliser java.nio.les canaux.FileChannel à écrire un octet dans un fichier - notions de base
Je n'ai pas d'expérience à l'aide de Java canaux. Je voudrais écrire un tableau d'octets dans un fichier. Actuellement, j'ai le code suivant:
String outFileString = DEFAULT_DECODED_FILE; //Valid file pathname
FileSystem fs = FileSystems.getDefault();
Path fp = fs.getPath(outFileString);
FileChannel outChannel = FileChannel.open(fp, EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE));
//Please note: result.getRawBytes() returns a byte[]
ByteBuffer buffer = ByteBuffer.allocate(result.getRawBytes().length);
buffer.put(result.getRawBytes());
outChannel.write(buffer); //File successfully created/truncated, but no data
Avec ce code, le fichier de sortie est créé, et tronquée si elle existe. Aussi, dans l'Ide, débogueur, je peux voir que buffer
contient des données. Aussi, la ligne outChannel.write()
est appelé avec succès, sans jeter une exception. Cependant, après les sorties de programme, les données n'apparaissent pas dans le fichier de sortie.
Quelqu'un peut-il (a) dites-moi si le FileChannel API est un choix acceptable pour l'écriture d'un tableau d'octets dans un fichier, et (b) dans l'affirmative, comment le code ci-dessus être modifié pour qu'il fonctionne?
Vous devez vous connecter pour publier un commentaire.
Comme gulyan points, vous devez
flip()
votre octets de la mémoire tampon avant de l'écrire. Alternativement, vous pouvez envelopper votre original tableau d'octets:Pour garantir l'écrire sur le disque, vous devez utiliser
force()
:Ou vous pouvez fermer le canal:
flip()
qui était nécessaire. (Cependant, j'ai utiliséwrap()
, à la place.) Il est logique, maintenant.Vous devriez appeler:
avant de l'écrire.
Cela permet de préparer le tampon de lecture.
Aussi, vous devriez appeler
avant de mettre des données en elle.
buffer.compact()
après avoir écrit à partir d'elle.Pour répondre à votre première question
C'est ok, mais il y a des moyens plus simples. Essayez d'utiliser un
FileOutputStream
. Habituellement, ce serait enveloppé par unBufferedOutputStream
pour les performances, mais la clé est à la fois de ces étendreOutputStream
qui a un simplewrite(byte[])
méthode. C'est beaucoup plus facile à travailler que le canal de tampon/API.Voici un exemple complet de FileChannel.