如果我针对文件创建java随机访问文件对象。重命名文件时会发生什么?
情形1。比方说,我创建了一个针对test.log的RAF对象。然后我重命名为test.log - >通过执行类似
的操作来执行test1.logmv test.log test1.log
在这种情况下,我的RAF对象会发生什么?
情况2。再次,针对test.log创建一个RAF对象:
mv test.log test1.log
touch test.log
在这种情况下,我的对象是指向test.log或test1.log
情形3。如果我的RAF对象指向最终将被旋转的日志文件怎么办?
最重要的是,有人可以向我解释封面下会发生什么吗?比如RAF对象如何指向/引用实际文件,以及重命名或删除文件时的工作方式。
答案 0 :(得分:4)
我做了一点测试:
至少在我的linux机器上它的行为与它类似。
当我尝试移动文件时,无论是否成功都会写入内容。
对于案例2,内容将被写入“test1.log”,这是你指向的那个。
对于3d情况,不,文件最终不会旋转。
对于之前的疯狂猜测感到抱歉。
答案 1 :(得分:0)
===========================
我自己的测试
===========================
RandomAccessFile rand = new RandomAccessFile("/tmp/test_log", "rw");
System.out.print("file created"); //======lineA======
while (true) {
Thread.sleep(8000);
System.out.print("finish sleeping");
int i = (int) rand.length(); //=====lineB=====
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
}
}
测试用例1:
在lineB之前的lineA之后删除test_log文件,它完成了读取整个文件而没有任何问题/异常。
测试用例2:
在lineB之前的lineA之后的mv / tmp / test_log /tmp/test_log.bk,再次,它完成了读取整个文件而没有任何问题/异常。
测试案例3:
在测试用例2之后,开始将额外的行写入/tmp/test_log.bk,
echo "test line1 bla bla" >> /tmp/test_log.bk
echo "test line2 bla bla" >> /tmp/test_log.bk
它现在读取整个文件的问题,PLUS,它还会读取test_log.bk中添加的新行。