web-dev-qa-db-fra.com

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 le faire écrire chaque information sur une nouvelle ligne. Quelqu'un peut-il 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 ressemble à 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 se présente comme suit: 

Today is a new dayTomorrow is the futureYesterday is the past

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

41
StartingGroovy

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

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

30
mfloryan

Comme @Steven le souligne, une meilleure solution 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 lignes pour vous, et gère également la fermeture du scripteur

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

76
tim_yates

Pourrait être plus propre à utiliser PrintWriter et sa méthode: println Assurez-vous juste de fermer le graveur

8
Steven

Je suis tombé sur cette question et inspiré par d'autres contributeurs. Je dois 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 chouette je pense :)

7
Patrick

@ Commentaire pour ID: 14 ​​. C'est pour moi un peu plus facile à écrire:

out.append it

au lieu de

out.println it

println n'a écrit que le premier fichier de ArrayList sur ma machine.

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

0
Alex