Как записать в текстовый файл - после прочтения с ввода? - PullRequest
0 голосов
/ 17 сентября 2018

Альтернативное название: как «красиво» «обновить» содержимое текстовых файлов с помощью Kotlin?

Я видел как мне записать файл в kotlin .

По сути, предлагаемое решение основано на создании объекта File и записи в него: File("somefile.txt").printWriter().use ...

Но хорошо: у меня уже есть такой код:

File(fname).bufferedReader().lineSequence().flatMap { transform(it) }

, где transform() - это мой собственный метод, который либо возвращает исходную строку, либо некоторые строки обновления, когда совпадает какое-то конкретное совпадение. (его подпись transform(line : String) : Sequence<String>)

Конечно: я мог бы присвоить результат flatMap() некоторой временной переменной, чтобы затем использовать его с printWriter().use.

Но есть ли хороший, канонический способ, который работает без временной переменной?

1 Ответ

0 голосов
/ 17 сентября 2018

Обратите внимание, что ваш код чтения (File().bufferedReader().lineSequence()) уже может быть упрощен до:

File(fname).useLines {
  it.flatMap(::transform)
}

Теперь о написании без помещения его в промежуточную переменную ...

File("writeTo").bufferedWriter().use { writer ->
  File("readFrom").useLines { lines ->
    lines.flatMap(::transform)
         .forEach { 
           writer.appendln(it)
         }
  }
}

Но я еще не совсем уверен в этом ... Мне не очень нравится ;-) Мне скорее нравится что-то вроде:

File("readFrom").useLines {
   ..
}.writeTo("writeTo")

но это не сработает, пока я использую useLines; -)

Но вот что-то похожее:

File("readFrom").useLines {
  it.flatMap(::transform)
    .writeTo(File("writeTo"))
}

Но для этого требуется следующая функция расширения:

fun Sequence<String>.writeTo(file: File) {
  file.bufferedWriter().use { writer -> forEach { writer.appendln(it) } }
}

С другой стороны ... Я всегда хотел иметь sequence.toFile-writer ;-) уже адаптировал его для использования разделителя в качестве параметра ...

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