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?
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.
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)
Pourrait être plus propre à utiliser PrintWriter et sa méthode: println Assurez-vous juste de fermer le graveur
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 :)
@ 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.