【问题标题】:when file moved/renamed - what's the difference between java RAF and File当文件移动/重命名时 - java RAF 和 File 有什么区别
【发布时间】:2012-05-28 20:11:12
【问题描述】:

我只想在 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有关系吗?

【问题讨论】:

  • java.io.File 不会抛出任何 IOExceptions。你在说什么?
  • @EJP 感谢您指出这一点。我应该把我的测试代码贴在第一位。我的意思是在文件读取期间抛出 IOExceptions。

标签: java java-io inode


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 你能否更具体地解释一下为什么上面的案例 1 和 2 表现不同?
    【解决方案3】:

    这里没有证据表明您已经移动或重命名了文件

    如果您是在程序之外这样做的,显然这只是时间问题。

    如果在尝试使用旧名称打开文件之前重命名文件,它将失败。这肯定很明显吗?

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 我在这里更新了我的标题,我更多的是在寻找为什么我们在移动或删除物理文件时会有它们之间的差异。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 2019-01-26
      • 2019-07-10
      • 2013-12-12
      • 2012-01-01
      • 2011-11-12
      • 2020-03-28
      相关资源
      最近更新 更多