如何在Java中替换大文件的第一行?

9

我希望在Java中将文本文件的第一行置空。这个文件有好几GB,我不想进行复制。根据这篇文章中的建议,我尝试使用RandomAccessFile来实现,但它写入的内容太多了。

以下是我的代码:

RandomAccessFile raInputFile = new RandomAccessFile(inputFile, "rw");
origHeaderRow = raInputFile.readLine();
raInputFile.seek(0);
raInputFile.writeChars(Strings.repeat(" ",origHeaderRow.length()));
raInputFile.close();

如果您需要一些示例输入和输出,以下是发生的情况:
之前:
first_name,last_name,age
Doug,Funny,10
Skeeter,Valentine,9
Patti,Mayonnaise,11
Doug,AlsoFunny,10

之后:

                        alentine,9
Patti,Mayonnaise,11
Doug,AlsoFunny,10

在这个例子中,在大多数编辑器中,该文件正确地以24个空格开头,但已替换48个字符(包括换行符)。在粘贴到这里后,我看到奇怪的问号。双倍大小的替换让我想到某些涉及编码的东西被搞砸了,但我尝试使用writeUTF得到了相同的结果。

只是让你知道,使用现代文件系统无法“原地”编辑文件。始终会创建一个新的副本。 - toto2
这个文件使用的是什么编码?1521?UTF8?UCS2? - Dilum Ranatunga
3
在这种情况下,这是可行的。覆盖单个字节非常简单。删除或插入一个字节需要进行复制。 - Roland Illig
@Roland 我记得我在尝试擦除硬盘的情况下读到过这个问题:覆盖文件内容仍然会在磁盘上保留原始文件(没有文件位置的参考,但黑客可能可以重建一些文件)。 - toto2
@toto2:是的,如果你想做得正确,安全地删除数据是很困难的,但我认为这不是重点。我认为原帖作者只是想从CSV文件中删除标题,以便其他程序(希望)忽略第一个空行。 - Roland Illig
显示剩余4条评论
2个回答

8

char在Java中占2个字节。

使用writeBytes替代。

raInputFile.writeBytes(Strings.repeat(" ",origHeaderRow.length()));

根据JavaDoc所示,它正是您需要的东西。


5

由于你正在编写字符(在Java中为16位),因此每个字符使用两个字节。我建议你尝试编写所需的字节数,否则你的空格将变成 nulspace 字节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接