读取行并在最后添加一些内容

时间:2017-01-16 07:39:36

标签: kotlin

我是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))
}

2 个答案:

答案 0 :(得分:5)

Januson有权idea。这是一些Kotlin代码来完成这项工作:

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

答案 1 :(得分:1)

除非使用RandomAccessFile,否则无法读取和写入同一文件。相反,您应该执行以下操作:

  • 从输入文件中读取行。
  • 进行所需的修改(附加到行尾,打印行)。
  • 将修改后的行写入输出文件。
  • 读取/写入关闭两个文件的所有数据后。
  • 删除输入文件。将输出文件重命名为输入文件名。