0

如果我针对文件创建一个 java Random Access File 对象。重命名文件时会发生什么?

情况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 对象如何指向/引用实际文件,当文件被重命名或删除时它是如何工作的。

4

2 回答 2

4

我做了一个小测试:

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

至少在我的 linux 机器上它的行为就像它。

当我尝试移动文件时,无论成功,内容都会被写入。

对于案例 2,内容将写入您所指向的“test1.log”。

对于 3d 情况,不,文件最终不会旋转。

抱歉之前的疯狂猜测。

于 2012-05-21T18:21:47.937 回答
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:

mv /tmp/test_log /tmp/test_log.bk 在 lineA 之后 lineB 之后,它再次完成读取整个文件而没有任何问题/异常。

测试用例 3:

在测试用例 2 之后,开始向 /tmp/test_log.bk 写入额外的行,

echo "test line1 bla bla" >> /tmp/test_log.bk
echo "test line2 bla bla" >> /tmp/test_log.bk

它现在读取整个文件的问题,另外,它还读取了 test_log.bk 中添加的新行。

于 2012-05-23T09:02:47.823 回答