Хотя подход Дона является действительным, в целом (однако, он вызовет исключение из-за синтаксической ошибки, и вам необходимо flush()
a BufferedOutputStream
), я планировал уточнить далее (что требуетего время).
Groovy не предоставляет специальных объектов для операций ввода-вывода.Таким образом, вы бы использовали Java FileOutputStream
(для записи байтов) или FileWriter
(для записи строк).Оба предоставляют конструктор, который принимает параметр boolean
append
.
Для обоих существуют декораторы (BufferedOutputStream
и BufferedWriter
), которые буферизуются.«Буферизация» в этой области означает, что содержимое не обязательно записывается мгновенно в основной поток, и, таким образом, существует потенциал для оптимизации ввода / вывода.
Дон уже предоставил образец для BufferedOutputStream
, а вот для BufferedWriter
:
File file = new File("foo")
if (file.exists()) {
assert file.delete()
assert file.createNewFile()
}
boolean append = true
FileWriter fileWriter = new FileWriter(file, append)
BufferedWriter buffWriter = new BufferedWriter(fileWriter)
100.times { buffWriter.write "foo" }
buffWriter.flush()
buffWriter.close()
Хотя Groovy не предоставляет свои собственные объекты ввода / вывода, Groovy JDK (GDK) расширяет несколько типов Java, добавляя удобные методы.В области вывода ввода / вывода релевантны типы OutputStream
и File
.
Итак, наконец, вы можете работать с этими"Groovy way":
new File("foo").newOutputStream().withWriter("UTF-8") { writer ->
100.times { writer.write "foo" + it }
}
EDIT: Согласно вашему дальнейшему запросу:
Ни один из методов GDK не позволяет устанавливать размер буфера.
Приведенный выше код Groovy перезапишет файл при повторном вызове.- Напротив, следующий фрагмент кода добавит строку к существующему файлу и, таким образом, можно вызывать повторно:
new File("foo").withWriterAppend("UTF-8") { it.write("bar") }