如何在Java中替换大文件的第一行?
我想用Java清空文本文件的第一行。这个文件有几GB,我不想复制。根据来自的建议,我试图使用RandomAccessFile来实现这一点,但是它写得太多了 这是我的密码:如何在Java中替换大文件的第一行?,java,file,file-io,replace,line,Java,File,File Io,Replace,Line,我想用Java清空文本文件的第一行。这个文件有几GB,我不想复制。根据来自的建议,我试图使用RandomAccessFile来实现这一点,但是它写得太多了 这是我的密码: RandomAccessFile raInputFile = new RandomAccessFile(inputFile, "rw"); origHeaderRow = raInputFile.readLine(); raInputFile.seek(0); raInputFile.writeChars(Strings.re
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,结果是一样的。当您编写字符(在Java中为16位)时,每个字符使用两个字节。
我建议您尝试写入所需的字节数,否则您的空格将变成
nul
和space
字节。char
在Java中是2个字节
改用writeBytes
raInputFile.writeBytes(Strings.repeat(" ",origHeaderRow.length()));
From看起来正是您想要的。正如您所知,用现代文件系统“就地”编辑文件是不可能的。始终创建新副本。文件的编码是什么?1521? UTF8?UCS2?@rough,看起来Jon Skeet也是作为“Skeeter”出现的:@toto2:在这种情况下,这不是不可能的。覆盖单个字节非常简单。删除或插入字节是需要复制的。@Roland我找不到引用,但我读到即使覆盖字节,在大多数现代文件系统上也会进行复制。我很惊讶,所以我记得。我不记得它在哪里了。。。也许它不可靠。