-1
A
回答
3
有没有办法做到这一点,而无需打开新文件并复制整个文本?
不,没有。当然,没有,如果你想要安全地。
而RandomAccessFile
也不会真的帮你。它将允许您用相同数量的字节替换文件中的一系列字节,但这不等于删除一行。
你可以使用英国皇家空军是这样的:
考虑初始状态
L1L2L3...LN
与L3...LN
更换L2L3...LN
或者你可以在一个时间使用英国皇家空军“滑”行一个per @ halfbit的答案。
但是:
在最坏的情况下,你需要复制整个文件内容,且平均案件涉及阅读和写作的
O(N)
线的字节数。这样做的简单方法需要在内存中保存
O(N)
行。“滑动”方法需要
O(N)
I/O操作(即系统调用)。最重要的是:通过就地文件更新删除行是有风险的。如果应用程序在进程中间中断(例如,电源故障),则最终会导致文件损坏。
FWIW:这是不是在Java中本身的限制。相反,它是现代操作系统代表/模型文件的一种限制。
0
看一看Random Access Files,这样就可以在需要的位置放置文件指针移动文本。
0
这里是一些独立的示例代码,使用RandomAccessFile
删除行,没有打开一个新文件,这似乎为我工作。 (就地复制虽然必需的。)
public static void main(String[] args) {
try {
// prepare test file
String path = "/tmp/test.txt";
writeTestLines(path, 999999);
// mode "rws": read + write synchronous
RandomAccessFile raf = new RandomAccessFile(path, "rws");
int bufSize = 1 << 20; // 1 MiB
Scanner s = new Scanner(new BufferedInputStream(new FileInputStream(raf.getFD()), bufSize));
PrintWriter pw = new PrintWriter(new BufferedOutputStream(new FileOutputStream(raf.getFD()), bufSize));
long writeOffset = 0;
for (int nr = 1;; nr++) {
if (!s.hasNextLine())
break;
String line = s.nextLine();
if (nr != 2 && !line.contains("00")) {
// switch to writing: save read offset, seek write offset
long readOffset = raf.getFilePointer();
raf.seek(writeOffset);
pw.println(line);
// switch to reading: save write offset, seek read offset
writeOffset = raf.getFilePointer();
raf.seek(readOffset);
}
}
// write buffered output and truncate file
raf.seek(writeOffset);
pw.flush();
raf.setLength(raf.getFilePointer());
pw.close();
s.close();
raf.close();
} catch (Exception ex) {
ex.printStackTrace(System.err);
}
}
public static void writeTestLines(String path, int n) throws IOException {
PrintWriter pw = new PrintWriter(path);
for (int i = 1; i <= n; i++) pw.println("line " + i);
pw.close();
}
注意,该代码假定由扫描仪读取该行结束是相同的由PrintWriter的(例如不只是一个单一的在Windows换行符)制作。
请注意,上面的代码可以优化,以不重写任何未改变的文件头 - 例如,通过首先跟踪写入偏移量然后切换到“普通”PrintWriter。
相关问题
- 1. 从txt文件中删除空行
- 2. C++从.txt文件中删除行
- 3. 从txt文件中删除前两行
- 4. 从文件名删除.txt - Java
- 5. 如何从txt文件中删除一行文本
- 6. 从txt文件中删除特定的行和一个符号
- 7. 从.txt文件中删除一行时出错
- 8. Python:从另一个txt文件中删除一个txt文件的元素
- 9. 批量删除txt文件中的行
- 10. 从txt文件中删除双引号
- 11. 从txt文件中删除列
- 12. txt文件删除
- 13. 使用java在txt文件中删除一行和下面的2行
- 14. 从文本文件中删除一行?
- 15. 删除一行并用txt文件中的新文本替换
- 16. 使用php删除txt文件一行一行使用php
- 17. 删除换行符在txt文件
- 18. 从.txt文件中获取随机行,然后从.txt文件中删除该行
- 19. 删除Python中的txt文件中的一行
- 20. 从多个.txt文件中删除最后6行
- 21. 从txt文件中删除空白行保留回车
- 22. 删除从.txt文件中的特定行cshell
- 23. 从文件中删除第一行
- 24. 从文件中删除行
- 25. 从文件中删除行
- 26. 从Java中的txt文件
- 27. 如何使用Java在txt文件的一行中删除日期格式?
- 28. 从java中的文件中删除一行
- 29. 从一个txt文件中删除线的块
- 30. 行出现在两个单独的txt文件,从一个txt文件中删除
写一个脚本来做到这一点,并用java调用它 – 2014-10-05 11:44:56
http://stackoverflow.com/questions/1377279/find-a-line-in-a-file-and-remove-it – 2014-10-05 11:47:37
我知道这个选项,即时通讯寻找一种方式来做到这一点,而不是应付整个文本(我知道行号) – JohnnyF 2014-10-05 11:51:17