2017-01-16 4 views
1

Я новичок в kotlin. Я пытаюсь прочитать файл строки за строкой и добавить что-то в конце каждого из них.Прочитайте строку и добавьте что-то в конце

Мой файл перед чтением:

abcd;abcd;abcd; 
bcda;bcda;bcda; 
dacb;dacb;dacb; 

Мой файл после прочтения и добавления:

abcd;abcd;abcd;smth1 
bcda;bcda;bcda;smth2 
dacb;dacb;dacb;smth3 

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

val pathToFile = "abc.txt" 
val scan = Scanner(File(pathToFile)) 
while (scan.hasNextLine()) { 
    val line = scan.nextLine() 
    var lista = ArrayList<String>() 
    lista = line.split(";") as ArrayList<String> 
    println(lista.get(0) + " and " + lista.get(1) + " and " + lista.get(2)) 
} 

ответ

1

Вы не можете читать и писать в тот же файл, если вы не используете RandomAccessFile. Вместо этого вы должны сделать следующее:

  • Прочитать строку из вашего входного файла.
  • Сделайте нужную модификацию (добавьте в конец строки, линию печати).
  • Запись измененной строки в выходной файл.
  • После прочтения/записи всех данных закрыть оба файла.
  • Удалить исходный файл. Переименуйте выходной файл в имя входного файла.
5

Januson имеет право idea. Вот некоторые Котлин код, чтобы сделать работу:

inline fun File.mapLines(crossinline transform: (line: String) -> String) { 
    val tempFile = createTempFile(prefix = "transform", suffix = ".txt") 
    tempFile.printWriter().use { writer -> 
     this.forEachLine { line -> writer.println(transform(line)) } 
    } 
    check(this.delete() && tempFile.renameTo(this)) { "failed to replace file" } 
} 

Пример использования:

val pathToFile = "abc.txt" 
var index = 0 
File(pathToFile).mapLines { line -> "${line}smth${++index}" } 

Если вы используете Java 1.7+, то вы можете использовать Files.move вместо delete/renameTo:

Files.move(tempFile.toPath(), this.toPath(), StandardCopyOption.REPLACE_EXISTING) 

См. Также Write to file after match in Kotlin.

Смежные вопросы