Ответ 1
Мне кажется, что вы работаете в Windows, и в этом случае новый символ строки не просто \n
, а скорее \r\n
Вы всегда можете получить правильный новый символ линии через System.getProperty("line.separator")
, например.
Я создал небольшую функцию, которая просто записывает текст в файл, но у меня возникают проблемы, заставляя писать каждую часть информации на новую строку. Может кто-нибудь объяснить, почему он ставит все на одной линии?
Вот моя функция:
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
Как вы можете видеть, текст сгруппирован вместе, а не разделен на новую строку на текст. Я предполагаю, что это имеет какое-то отношение к тому, как я добавляю его в свой список?
Мне кажется, что вы работаете в Windows, и в этом случае новый символ строки не просто \n
, а скорее \r\n
Вы всегда можете получить правильный новый символ линии через System.getProperty("line.separator")
, например.
Как указывает @Steven, лучший способ:
public void writeToFile(def directory, def fileName, def extension, def infoList) {
new File("$directory/$fileName$extension").withWriter { out ->
infoList.each {
out.println it
}
}
}
Поскольку это обрабатывает разделитель строк для вас и обрабатывает также закрытие записи
(и не открывать и закрывать файл каждый раз, когда вы пишете строку, что может быть медленным в исходной версии)
Может быть чище использовать PrintWriter
и его метод println
.
Просто убедитесь, что вы закрыли писатель, когда вы закончите
Я столкнулся с этим вопросом и вдохновился другими участниками. Мне нужно добавить некоторый контент в файл один раз в строке. Вот что я сделал.
class Doh {
def ln = System.getProperty('line.separator')
File file //assume it initialized
void append(String content) {
file << "$content$ln"
}
}
Довольно аккуратный, я думаю:)
@Comment для ID: 14. Мне это проще написать:
out.append it
вместо
out.println it
println на моей машине записывает только первый файл ArrayList, с добавлением я получаю весь список, записанный в файл.
В любом случае, для быстрого и грязного решения.