Groovy écrire dans un fichier (nouvelle ligne)

J'ai créé une petite fonction qui écrit simplement du texte dans un fichier, mais j'ai des problèmes pour écrire chaque information sur une nouvelle ligne. Quelqu'un peut m'expliquer pourquoi il met tout sur la même ligne?

Voici ma fonction:

public void writeToFile(def directory, def fileName, def extension, def infoList) {
    File file = new File("$directory/$fileName$extension")

    infoList.each {
        file << ("${it}n")
    }
}

Le code simple avec lequel je le teste est quelque chose comme ceci:

def directory = 'C:/'
def folderName = 'testFolder'
def c

def txtFileInfo = []

String a = "Today is a new day"
String b = "Tomorrow is the future"
String d = "Yesterday is the past"

txtFileInfo << a
txtFileInfo << b
txtFileInfo << d

c = createFolder(directory, folderName) //this simply creates a folder to drop the txt file in

writeToFile(c, "garbage", ".txt", txtFileInfo)

Ce qui précède crée un fichier texte dans ce dossier et le contenu du fichier texte ressemble à ceci:

Today is a new dayTomorrow is the futureYesterday is the past

Comme vous pouvez le voir, le texte est tout groupé ensemble au lieu d'être séparés sur une nouvelle ligne par texte. Je suppose que cela a quelque chose à voir avec la façon dont je l'ajoute dans ma liste?

40
demandé sur skaffman 2010-11-25 01:56:31

5 réponses

Il me semble que vous travaillez dans windows, auquel cas un nouveau caractère de ligne n'est pas simplement \n mais plutôt \r\n

Vous pouvez toujours obtenir le nouveau caractère de ligne correct via System.getProperty("line.separator") par exemple.

28
répondu mfloryan 2010-11-24 23:02:23

Comme le souligne @ Steven, une meilleure façon serait:

public void writeToFile(def directory, def fileName, def extension, def infoList) {
  new File("$directory/$fileName$extension").withWriter { out ->
    infoList.each {
      out.println it
    }
  }
}

Comme cela gère le séparateur de ligne pour vous, et gère également la fermeture de l'écrivain

(et n'ouvre et ne ferme pas le fichier chaque fois que vous écrivez une ligne, ce qui peut être lent dans votre version originale)

74
répondu tim_yates 2012-12-15 14:55:20

Pourrait être plus propre pour utiliser PrintWriter et sa méthode: println Assurez-vous simplement de fermer l'écrivain lorsque vous avez terminé

8
répondu Steven 2010-11-25 04:55:28

Je suis tombé sur cette question et inspiré par d'autres contributeurs. J'ai besoin d'ajouter du contenu à un fichier une fois par ligne. Voici ce que j'ai fait.

class Doh {
   def ln = System.getProperty('line.separator')
   File file //assume it's initialized 

   void append(String content) {
       file << "$content$ln"
   }
}

Assez soigné je pense :)

6
répondu Patrick 2011-10-08 09:25:59

@ commentaire pour ID: 14. C'est pour moi plutôt plus facile d'écrire:

out.append it

Au Lieu de

out.println it

Println n'a écrit sur ma machine que le premier fichier de L'ArrayList, avec append je reçois toute la liste écrite dans le fichier.

Veuillez quand même pour la solution rapide et sale.

0
répondu Alex 2012-09-27 19:13:08