Java RAF - 如果重命名文件会怎样

时间:2012-05-21 18:18:07

标签: java file-io

如果我针对文件创建java随机访问文件对象。重命名文件时会发生什么?

情形1。比方说,我创建了一个针对test.log的RAF对象。然后我重命名为test.log - >通过执行类似

的操作来执行test1.log
mv test.log test1.log

在这种情况下,我的RAF对象会发生什么?

情况2。再次,针对test.log创建一个RAF对象:

mv test.log test1.log
touch test.log

在这种情况下,我的对象是指向test.log或test1.log

情形3。如果我的RAF对象指向最终将被旋转的日志文件怎么办?

最重要的是,有人可以向我解释封面下会发生什么吗?比如RAF对象如何指向/引用实际文件,以及重命名或删除文件时的工作方式。

2 个答案:

答案 0 :(得分:4)

我做了一点测试:

  • 创建了一个随机访问文件,并弹出了一个joption窗格。
  • 当对话框打开时,我删除了完全允许的文件。
  • 然后尝试在文件上写下并关闭它,这是静默发生的。

至少在我的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中添加的新行。