我只想在java / linux上下文中讨论这个问题。
RandomAccessFile rand = new RandomAccessFile("test.log", "r");
VS
File file = new File("test.log");
创建之后,我们开始将文件读到最后。
在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);
}
}
但是在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
}
}
}
任何人都可以向我解释原因吗?与文件的inode有什么关系吗?
答案 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,我们可以写或读文件。