8
votes

Pourquoi BufferedWriter n'écrit-il pas dans le fichier?

Voici l'extrait de code.

while((lines = br.readLine())!=null){
                    st = new StringTokenizer(lines);
                    bw = new BufferedWriter(new FileWriter("files/file.txt"));
                    while(st.hasMoreTokens()){
                        System.out.println(st.nextToken());
                       bw.write(st.nextToken());
                    }
                    bw.close();
                }

                br.close();


3 commentaires

Y a-t-il un message d'erreur? Un fichier est-il créé? Appelez-vous proche ()?


Pourquoi instanciez-vous un nouveau bufferedWriter pour chaque écriture que vous faites? En outre, vous devez toujours fermer tous les flux ouverts (après le travail terminé, OFC :-)).


Après votre dernier édition, vous créez toujours la bufferedwitter à l'intérieur de la boucle. Cela tronquera votre dossier


3 Réponses :


17
votes

Quelques choses:

  1. Vous créez un nouveau Fordwriter à chaque fois via la boucle, ce qui tronquera le fichier à chaque fois.
  2. BufferedWriter est tamponnée et vous ne rincez jamais le tampon. Vous devez appeler BW.FLUSH (), voire mieux, fermez l'écrivain lorsque vous avez terminé.

2 commentaires

Mieux, rincer le décorateur dans le cas heureux. Fermez la ressource sous-jacente dans enfin . (OBFILEWRITECOMMENT: FileWriter Remets Le codage du personnage qui se trouve être la "défaut" à l'époque. Bien mieux pour choisir explicitement un codage, ce qui signifie shunning filewriter (Utiliser < Code> OutputStreamwriter ).)


La fermeture fournit une affleurement implicite, la plupart des clôtures de code simples sont enfin suffisantes.



15
votes
  • Vous créez le fichier de fichiers à l'intérieur de la boucle afin que vous tronquez toujours le fichier dans chaque cycle.
  • Vous avez oublié de fermer / rincer l'écriture
  • Mais avec une chance (la résiliation du programme peut provoquer le flush de rincer), le fichier contiendrait le dernier mot de votre fichier d'entrée que je ne peux que deviner serait une nouvelle ligne et vous avez probablement manqué lorsque vous avez ouvert le fichier à Vérifiez le contenu.

    Votre boucle interne devrait être quelque chose comme ceci: xxx


3 commentaires

Le code n'est pas complet, par exemple, je n'ai pas déclaré que le Tokenizer semble causer l'exception. C'est juste un échantillon pour vous guider :)


bw.close () est très important. Merci de suggestion.


BW.FLOSE () ne sera pas appelé en cas de ioException dans le code de code que vous avez fourni. S'il vous plaît, envisagez d'utiliser try-with-ressources construire dans votre réponse.



1
votes

Idéalement, vous devez utiliser le constructeur suivant pour créer FileWriter , xxx

second paramètre, true est destiné à ajouter les nouvelles données. FileWriter ne tronque pas votre écriture précédente.

et votre lecteur pourra lire des données correctes.


0 commentaires