it-swarm.com.de

Groovy schreiben in Datei (Newline)

Ich habe eine kleine Funktion erstellt, die einfach Text in eine Datei schreibt, aber ich habe Probleme damit, jede Information in eine neue Zeile zu schreiben. Kann jemand erklären, warum es alles auf dieselbe Linie setzt? 

Hier ist meine Funktion: 

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

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

Der einfache Code, mit dem ich es teste, sieht so aus:

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)

Das Obige erstellt eine Textdatei in diesem Ordner und der Inhalt der Textdatei sieht folgendermaßen aus: 

Today is a new dayTomorrow is the futureYesterday is the past

Wie Sie sehen, ist der Text zusammengebündelt und nicht in einer neuen Zeile pro Text getrennt. Ich gehe davon aus, dass es etwas damit zu tun hat, wie ich es meiner Liste hinzufüge?

41
StartingGroovy

Es sieht für mich so aus, als würden Sie in Windows arbeiten. In diesem Fall ist ein neues Zeilenzeichen nicht einfach \n, sondern \r\n

Sie können das korrekte neue Zeilenzeichen beispielsweise immer durch System.getProperty("line.separator") erhalten.

30
mfloryan

Wie @Steven darauf hinweist, wäre ein besserer Weg:

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

Da dies für Sie das Zeilentrennzeichen übernimmt, wird auch der Writer geschlossen

(und öffnet und schließt die Datei nicht jedes Mal, wenn Sie eine Zeile schreiben, was in Ihrer Originalversion langsam sein könnte)

76
tim_yates

Vielleicht sollten Sie PrintWriter und seine Methode sauberer verwenden: println Stellen Sie sicher, dass Sie den Writer schließen, wenn Sie fertig sind

8
Steven

Ich bin auf diese Frage gestoßen und habe mich von anderen Mitwirkenden inspirieren lassen. Ich muss einmal pro Zeile etwas an eine Datei anhängen. Hier ist was ich getan habe.

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

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

Ziemlich ordentlich denke ich :)

7
Patrick

@Kommentar für ID: 14 ​​..__ Es ist für mich etwas einfacher zu schreiben:

out.append it

anstatt

out.println it

println hat auf meinem Rechner nur die erste Datei der ArrayList geschrieben, mit append bekomme ich die ganze Liste in die Datei geschrieben.

Auf jeden Fall für die schnelle und schmutzige Lösung.

0
Alex