-1

我只想在 java/linux 上下文中讨论这个问题。

RandomAccessFile rand = new RandomAccessFile("test.log", "r");

VS

File file = new File("test.log");

创建完成后,我们开始读取文件到最后。

  1. 在 java.io.File 情况下,如果在文件读取之前 mv 或删除物理文件,它将在读取文件时抛出 IOException。

    public void readIOFile() throws IOException, InterruptedException {
        File file = new File("/tmp/test.log");
        System.out.print("file created"); // convert byte into char
        Thread.sleep(5000);
        while (true) {
            char[] buffer = new char[1024];
            FileReader fr = new FileReader(file);
            fr.read(buffer);
            System.out.println(buffer);
        }
    }
    
  2. 但在 RandomFileAccess 情况下,如果您在文件读取之前 mv 或删除物理文件,它将完成读取文件而不会出现错误/异常。

    public void readRAF() throws IOException, InterruptedException {
        File file = new File("/tmp/test.log");
        RandomAccessFile rand = new RandomAccessFile(file, "rw");
        System.out.println("file created"); // convert byte into char
        while (true) {
            System.out.println(file.lastModified());
            System.out.println(file.length());
            Thread.sleep(5000);
            System.out.println("finish sleeping");
            int i = (int) rand.length();
            rand.seek(0); // Seek to start point of file
            for (int ct = 0; ct < i; ct++) {
                byte b = rand.readByte(); // read byte from the file
                System.out.print((char) b); // convert byte into char
        }
    }
    

    }

谁能向我解释为什么?与文件的inode有什么关系吗?

4

4 回答 4

1

与许多其他 java IO 工具不同,File 只是一个不可变的句柄,当您需要执行文件系统网关操作时,您RandomAccessFileInputStream不时拖动它。您可能将其视为参考: File instance is pointing to some specified path。另一方面RandomAccessFile,仅在构建时才具有路径的概念:它转到指定的路径,打开文件并获取文件系统描述符——您可以将其视为给定文件的唯一 id,它不会在移动和其他一些操作——并在它的整个生命周期中使用这个 id 来寻址文件。

于 2013-07-22T13:31:49.490 回答
0

There is no evidence here that you have moved or renamed the file at all.

If you did thatt from outside the program, clearly it is just a timing issue.

If you rename a file before you try to open it with the old name, it will fail. Surely this is obvious?

于 2012-06-02T02:10:28.120 回答
0

java.io.File 类提供了基于操作系统的文件系统服务,例如创建文件夹、文件、验证权限、更改文件名等。

java.io.RandomAccessFile 类提供对存储在数据文件中的记录的随机访问。使用这个类,可以对数据进行读写和操作。另一种灵活性是它可以读取和写入原始数据类型,这有助于结构化方法处理数据文件。

与 java.io 中的输入和输出流类不同,RandomAccessFile 用于读取和写入文件。RandomAccessFile 不继承自 InputStream 或 OutputStream。它实现了 DataInput 和 DataOutput 接口。

于 2012-05-22T10:38:22.763 回答
-1

主要区别之一是,文件不能直接控制写入或读取,它需要 IO 流来做到这一点。作为 RAF,我们可以写入或读取文件。

于 2012-05-22T10:42:17.450 回答