当文件移动/重命名时 - java RAF和File之间的区别是什么

时间:2012-05-22 10:32:40

标签: java java-io inode

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

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

VS

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

创建之后,我们开始将文件读到最后。

  1. 在java.io.File的情况下,如果您在文件读取之前删除或删除物理文件,它将在读取文件时抛出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情况下,如果您在文件读取之前删除或删除了物理文件,它将完成读取文件而不会出现错误/异常。

    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
        }
    }
    

    }

  3. 任何人都可以向我解释原因吗?与文件的inode有什么关系吗?

4 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

此处没有证据表明您已移动或重命名了文件

如果你是从节目之外做的那样,显然这只是一个时间问题。

如果在尝试使用旧名称打开文件之前重命名文件,则会失败。当然这很明显?

答案 2 :(得分:0)

RandomAccessFile或者说InputStream以及许多其他Java IO工具不同,File只是一个不可变的句柄,当您需要执行文件系统网关操作时,它会不时地拖动。您可以将其视为参考:文件实例指向指向某个指定的路径。另一方面,RandomAccessFile仅在构造时具有路径概念:它转到指定路径,打开文件并获取文件系统描述符 - 您可能会将其视为唯一ID给定文件的大小,在移动和其他一些操作时不会改变 - 并在整个生命周期内使用此id来寻址文件。

答案 3 :(得分:-1)

其中一个主要区别是,File无法直接控制写入或读取,它需要IO流才能做到这一点。作为RAF,我们可以写或读文件。