2017-01-16 2 views
1

Ich bin neu in Kotlin. Ich versuche, Datei Zeile für Zeile zu lesen und am Ende etwas zu jedem von ihnen hinzuzufügen.Zeile lesen und am Ende etwas anhängen

Meine Datei vor dem Lesen:

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

Meine Datei nach dem Lesen und Anhängen:

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

I-Code habe für Datei Zeile für Zeile zu lesen, aber könnten Sie mir sagen, wie Zeichenfolge zu jedem hinzufügen von ihnen?

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

Antwort

1

Sie können nicht auf die gleiche Datei lesen und schreiben, es sei denn Sie RandomAccessFile verwenden. Stattdessen sollten Sie Folgendes tun:

  • Zeile aus Ihrer Eingabedatei lesen.
  • Die gewünschte Änderung vornehmen (an das Ende der Zeile anhängen, Zeile drucken).
  • Geänderte Zeile in die Ausgabedatei schreiben.
  • Nach dem Lesen/Schreiben aller Daten schließen Sie beide Dateien.
  • Eingabedatei löschen. Benennen Sie die Ausgabedatei in den Namen der Eingabedatei um.
5

Januson hat das Recht idea. Hier einige Kotlin Code, um die Arbeit zu tun:

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" } 
} 

Beispiel Nutzung:

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

Wenn Sie Java 1.7+ verwenden, dann können Sie Files.move anstelle von delete/renameTo:

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

Siehe auch Write to file after match in Kotlin.

Verwandte Themen