使用Java删除文件的最后一行

我有一个.txt文件,我想用Java处理它。 我想删除它的最后一行。

我需要有关如何实现这一点的想法,而无需将整个内容复制到另一个文件中并忽略最后一行。 有什么建议么?

您可以通过扫描文件找到最后一行的开头,然后使用FileChannel.truncateRandomAccessFile.setLength截断它。

通过使用RandomAccessFile,您可以:

  • 使用方法搜索(长)向前跳并读取这些行。 但你不会确切地知道跳跃应该有多大。
  • 要删除最后一行,你需要最后一行开头的位置,所以在读取每一行之前,存储它们的文件指针位置(方法getFilePointer() )。 删除到该位置使用setLength(long)

代码将是这样的:

  LinkedList lines=null; int howMuch = 1; // one line to read and delete try{ RandomAccessFile raf = new RandomAccessFile(inputFileName, "rw"); System.out.println("File Length="+raf.length()); long step = 20; // here I advice to write average length of line long jump = raf.length()(); LinkedList pos = new LinkedList(); Entry,LinkedList> rLinesRead = getRemainingLines(raf, new AbstractMap.SimpleEntry,LinkedList> (lines,pos)); while(rLinesRead.getKey().size(),LinkedList> getRemainingLines(RandomAccessFile raf, Entry,LinkedList> linesAlreadyLoadedFromEnd) throws IOException{ LinkedList pLines = linesAlreadyLoadedFromEnd.getKey(); LinkedList pPos = linesAlreadyLoadedFromEnd.getValue(); long init=raf.getFilePointer(); String str = raf.readLine(); if(pPos.size()>0?pPos.getFirst()==0:false || str==null) return linesAlreadyLoadedFromEnd; LinkedList lines = new LinkedList(); LinkedList pos = new LinkedList(); if(init==0L ){ lines.add(str); pos.add(0L); } Long tmpPos = raf.getFilePointer(); while ((str = raf.readLine())!=null && !pPos.contains(tmpPos)){ lines.add(str); pos.add(tmpPos); tmpPos = raf.getFilePointer(); } pLines.addAll(0,lines); pPos.addAll(0,pos); return new AbstractMap.SimpleEntry,LinkedList> (pLines,pPos); }