我试图附加到一个文件,以便我首先要删除最后一行,然后开始追加。但是,我无法弄清楚如何删除文件的最后一行。
我附加文件如下:
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>
答案 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")