2014-12-02 73 views
0

我想追加到一個文件,我首先要刪除最後一行,然後開始追加。但是,我無法確定如何刪除文件的最後一行。如何在scala中刪除文件的最後一行?

我追加如下文件:

val fw = new FileWriter("src/file.txt", true) ; 
fw.write("new item"); 

任何人可以幫我嗎?

編輯:

val lines_list = Source.fromFile("src/file.txt").getLines().toList 
val new_lines = lines_list.dropRight(1) 
val pw = new PrintWriter(new File("src/file.txt")) 
(t).foreach(pw.write) pw.write("\n") 
pw.close() 

下你的方法,我試圖寫回文件,但我這樣做的時候,所有的內容,到最後一行刪不過來,在單行線,後我希望他們分開來。

+0

你不能只刪除文件中的最後一行。您必須創建沒有最後一行的新文件。或者使用FileChannel:https://docs.oracle.com/javase/tutorial/essential/io/rafs.html – 2014-12-02 18:41:49

+0

我會將文本行加載到列表中,並刪除最後一項,然後開始追加。 – Marcs 2014-12-02 18:47:57

+0

如果你的文件很小 - 確定。但如果它是1GB或更多呢? – 2014-12-02 19:28:06

回答

0

我Scala是遙遠,所以人們也許可以給你一個更好的解決方案:

import scala.io.Source 
import java.io._ 

object Test00 { 
    def main(args: Array[String]) = { 

    val lines = Source.fromFile("src/file.txt").getLines().toList.dropRight(1) 

    val pw = new PrintWriter(new File("src/out.txt")) 

    (lines :+ "another line").foreach(pw.println) 

    pw.close() 
    } 
} 

很抱歉的硬編碼追加,我用它只是爲了測試一切正常。

+0

我試圖按照你的方式,我這樣做:。 VAL lines_list = Source.fromFile( 「SRC/file.txt的」)getLines()toList \t VAL new_lines = lines_list.dropRight(1) \t \t \t \t VAL PW =新的PrintWriter(新文件( 「SRC/file.txt的」)) (t)的.foreach(pw.write) pw.write( 「\ n」 個) pw.close () 但是,它給了我在刪除單行最後一行後文件中的元素;如何在每行之間添加「\ n」,然後將其寫入文件? – 2014-12-02 20:34:14

+0

這是一個使用pw。如果文本文件很大,不是最好的。 – Marcs 2014-12-02 21:38:32

0

返回隨機訪問文件的位置沒有最後一行。

import java.io.{RandomAccessFile, File} 

    def randomAccess(file: File) = { 
    val random = new RandomAccessFile(file, "rw") 

    val result = findLastLine(random, 0, 0) 
    random.seek(result) 
    random 
    } 

    def findLastLine(random: RandomAccessFile, position: Long, previous: Long): Long = { 

    val pointer = random.getFilePointer 
    if (random.readLine == null) { 
     previous 
    } else { 
     findLastLine(random, previous, pointer) 
    } 
    } 


    val file = new File("build.sbt") 
    val random = randomAccess(file) 

和測試:

val line = random.readLine() 
    logger.debug(s"$line") 
1

對於非常大的文件,一個簡單的解決方案依賴於OS相關的工具,例如sed(流編輯器),並因此考慮這樣一個電話,

import sys.process._ 
Seq("sed","-i","$ d","src/file1.txt")! 

這將刪除文本文件的最後一行。這種方法並不是Scalish,但它在不離開Scala的情況下解決了問題。

+0

它說未終止的替代模式。 :O – 2014-12-02 20:29:26

+0

Scala 2.11.2 REPL在逐字複製時工作... – elm 2014-12-03 10:44:03

相關問題