阅读行并在最后添加一些内容
我是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)) }
Januson有正确的想法 。 这是一些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)
参见在Kotlin比赛后写入文件 。
除非使用RandomAccessFile,否则无法读取和写入相同的文件。 相反,你应该做以下几点:
- 从输入文件中读取一行。
- 做你想要的修改(追加到行尾,打印行)。
- 将修改的行写入输出文件。
- 读取/写入所有数据后关闭这两个文件。
- 删除输入文件。 将输出文件重命名为输入文件名称。