我只想在 java/linux 上下文中讨论这个问题。
RandomAccessFile rand = new RandomAccessFile("test.log", "r");
VS
File file = new File("test.log");
创建完成后,我们开始读取文件到最后。
在 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); } }
但在 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有什么关系吗?