Groovy запись в файл (новая строка) - PullRequest
41 голосов
/ 25 ноября 2010

Я создал небольшую функцию, которая просто записывает текст в файл, но у меня возникают проблемы с записью каждого фрагмента информации в новую строку. Может кто-нибудь объяснить, почему он помещает все в одну строку?

Вот моя функция:

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

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

Простой код, с которым я его тестирую, выглядит примерно так:

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)

Приведенное выше создает текстовый файл в этой папке, и содержимое текстового файла выглядит следующим образом:

Today is a new dayTomorrow is the futureYesterday is the past

Как видите, весь текст сгруппирован, а не разделен новой строкой для каждого текста. Я предполагаю, что это как-то связано с тем, как я добавляю это в свой список?

Ответы [ 5 ]

77 голосов
/ 25 ноября 2010

Как указывает @Steven, лучшим способом было бы:

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

Поскольку это обрабатывает разделитель строк для вас и обрабатывает закрывающее устройство записи

(и не делает 't открывайте и закрывайте файл каждый раз, когда пишете строку, которая может быть медленной в исходной версии)

30 голосов
/ 25 ноября 2010

Мне кажется, что вы работаете в Windows, и в этом случае новый символ строки не просто \n, а скорее \r\n

Вы всегда можете получить правильный символ новой строки через System.getProperty("line.separator") например.

8 голосов
/ 25 ноября 2010

Может быть чище использовать PrintWriter и его метод: println Просто убедитесь, что вы закроете устройство записи, когда закончите

7 голосов
/ 08 октября 2011

Я сталкивался с этим вопросом и вдохновлялся другими участниками. Мне нужно добавить контент в файл один раз в строке. Вот что я сделал.

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

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

Довольно аккуратно, я думаю:)

0 голосов
/ 24 августа 2012

@ Комментарий для ID: 14. Мне проще написать:

out.append it

вместо

out.println it

println сделал на моей машине только запись первого файла ArrayList, с добавлением я получаю весь List, записанный в файл.

В любом случае, пожалуйста, за быстрое и грязное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...