FileInputStream是否在内部制作文件内容的快照?

问题描述 投票:3回答:1

我想出了以下代码片段(它通过反转内容来覆盖文件),并想知道它在内部如何工作:

    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到达最后一行时,我们已经对其进行了修改,尽管可以读取旧内容...

java fileinputstream randomaccessfile
1个回答
0
投票

实际上,这不起作用。尝试通过以下代码段创建的文件:

  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)已用完,从而使读取器再次从修改后的文件中读取。

© www.soinside.com 2019 - 2024. All rights reserved.