我想用Java擦除文本文件中的最后一行;但是,下面的代码会删除所有内容。
public void eraseLast()
{
while(reader.hasNextLine()) {
reader.nextLine();
if (!reader.hasNextLine()) {
try {
fWriter = new FileWriter("config/lastWindow.txt");
writer = new BufferedWriter(fWriter);
writer.write("");
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
答案 0 :(得分:18)
如果您想在不创建新文件的情况下从文件中删除最后一行,您可以执行以下操作:
RandomAccessFile f = new RandomAccessFile(fileName, "rw");
long length = f.length() - 1;
do {
length -= 1;
f.seek(length);
byte b = f.readByte();
} while(b != 10);
f.setLength(length+1);
f.close();
从倒数第二个字节开始,寻找换行符,并继续向后搜索,直到找到一个。然后在换行后截断文件。
如果最后一个字符是换行符(即最后一行的结尾),则从倒数第二个字节而不是最后一个字节开始。
答案 1 :(得分:9)
您正在创建一个替换旧文件的新文件,您需要这样的内容
public void eraseLast() {
StringBuilder s = new StringBuilder();
while (reader.hasNextLine()) {
String line = reader.readLine();
if (reader.hasNextLine()) {
s.append(line);
}
}
try {
fWriter = new FileWriter("config/lastWindow.txt");
writer = new BufferedWriter(fWriter);
writer.write(s.toString());
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
答案 2 :(得分:5)
上面的答案需要稍加修改,以处理文件中只剩下1行的情况(否则你会得到负向搜索偏移的IOException):
RandomAccessFile f = new RandomAccessFile(fileName, "rw");
long length = f.length() - 1;
do {
length -= 1;
f.seek(length);
byte b = f.readbyte();
} while(b != 10 && length > 0);
if (length == 0) {
f.setLength(length);
} else {
f.setLength(length + 1);
}
答案 3 :(得分:4)
您正在以覆盖模式打开文件(因此单个write
操作将擦除文件的全部内容),以附加模式打开它应该是:
fWriter = new FileWriter("config/lastWindow.txt", true);
此外,它不会删除 last 行:虽然读者已到达文件的当前最后一行,但作者在最后一行之后 - 因为我们在上面指定了应该使用附加模式。
看看这个answer,了解你将要做的事情。
答案 4 :(得分:0)
我从其他人那里受益,但代码无效。这是我在android studio上的工作代码。
File file = new File(getFilesDir(), "mytextfile.txt");
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
byte b;
long length = randomAccessFile.length() ;
if (length != 0) {
do {
length -= 1;
randomAccessFile.seek(length);
b = randomAccessFile.readByte();
} while (b != 10 && length > 0);
randomAccessFile.setLength(length);
randomAccessFile.close();
}
答案 5 :(得分:0)
这是我的解决方法
private fun removeLastSegment() {
val reader = BufferedReader(FileReader(segmentsFile))
val segments = ArrayList<Segment>()
var line: String?
while (reader.readLine().also { line = it } != null) {
segments.add(Gson().fromJson(line, Segment::class.java))
}
reader.close()
segments.remove(segments.last())
var writer = BufferedWriter(FileWriter(segmentsFile))
writer.write("")
writer = BufferedWriter(FileWriter(segmentsFile, true))
for (segment in segments) {
writer.appendLine(Gson().toJson(segment))
}
writer.flush()
writer.close()
lastAction--
lastSegment--
}