我想出了以下代码片段(它通过反转内容来覆盖文件),并想知道它在内部如何工作:
File in = new File(arg);
try (Reader reader = new InputStreamReader(new FileInputStream(in));
RandomAccessFile randomAccessFile = new RandomAccessFile(in, "rw")) {
int character;
long length = in.length();
while ((character = reader.read()) > 0) {
randomAccessFile.seek(--length);
randomAccessFile.write(character);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
因此,reader
将从头开始读取文件的每个字节,并且在接收到该字节后,randomAccessFile
会将其写入文件中的最后一个字符位置,并将其指针向文件的开头靠近一步。
[即使有可能在文件修改期间,我们仍然能够读取旧内容?即到我们通过reader
到达最后一行时,我们已经对其进行了修改,尽管可以读取旧内容...
实际上,这不起作用。尝试通过以下代码段创建的文件:
File in = new File("c:\\temp\\test.txt");
try (PrintWriter pw = new PrintWriter(in)) {
for (int i=0;i<50000;i++) {
pw.print(i % 10);
}
}
这将创建〜49K文件。您会注意到实际上只有文件的最后一部分被反转了,这是因为读取器(很可能在StreamDecoder.class中)的内部缓冲区(大约8K或16K)已用完,从而使读取器再次从修改后的文件中读取。