2017-01-16 11 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です。ここで仕事をするためのいくつかの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}" } 

あなたがあなたの代わりにdelete/renameToFiles.moveを使用できるJava 1.7以降を使用している場合:

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

Write to file after match in Kotlinも参照してください。

関連する問題