Подтвердить что ты не робот

Groovy записать в файл (новая строка)

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

out.append it

вместо

out.println it

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

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