如何在scala中删除文件的最后一行?

时间:2014-12-02 18:38:44

标签: 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()

按照你的方法后,我试着写回文件,但是当我这样做时,删除最后一行的所有内容都在一行中,但是我希望它们分开来。< / p>

3 个答案:

答案 0 :(得分:1)

对于非常大的文件,简单的解决方案依赖于OS相关工具,例如sed(流编辑器),因此请考虑这样的调用,

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

将删除文本文件的最后一行。这种方法并非如此Scalish,但它在不离开Scala的情况下解决了这个问题。

答案 1 :(得分: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()
  }
}

对于硬编码的追加感到抱歉,我用它来测试一切正常。

答案 2 :(得分: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")