从软盘读取时禁用缓存

时间:2018-08-20 05:22:28

标签: java caching disk floppy

TLDR::如果要在MacOS上轮询软盘,请使用rdisk并清理该文件上的所有句柄!

晚上好!

我想使用一些旧的软盘作为ID卡,因此我需要知道何时将其插入USB阅读器。索尼制造的读取器显示为Linux和MacOS下的磁盘驱动器,这使我认为(如果我错了,请纠正我)插入磁盘时不会收到任何信号。所以我转向了投票。我在下面编写了Java,它使用FileReader轮询原始磁盘,直到它可以读取某些内容然后返回为止。我对inverse = true做同样的事情,以检测何时弹出卡。第一步工作并在插入磁盘后返回。尝试检测磁盘的移除时出现我的问题。某种情况下正在缓存数据,因为当我弹出软盘时,System.out.println(f.read());会继续打印存储在软盘上的第一个字符的字符代码。但是,当我调用head -c 100 /dev/disk2时,它会正确检测到读取错误。什么可能存储了读取的字节?如何强制Java直接从磁盘刷新数据?

private static void waitDevice(String path, int pollIntervalMS, boolean invert) {
    try {
        while (invert ^ !pollDevice(path)) {
            System.out.println("Waiting...");
            Thread.sleep(pollIntervalMS);
        }
    }
    catch (InterruptedException e)  {}
}

private static Boolean pollDevice(String path) {
    try {
        FileReader f = new FileReader(path);
        System.out.println(f.read());
        f.close();
        return true;
    }
    catch (FileNotFoundException e) {
        //e.printStackTrace();
    }
    catch (IOException e) {
        //e.printStackTrace();
    }
    return false;
}

这是我完整程序的输出。

驱动器已连接。没有软盘

Waiting...
37

驱动器已连接。插入软盘。读取先打印的数据。

%%Bob%Smith%1534739997363%2fb66e3469de30174ddf9a80386a5cc6810baddd1a1dfea3489cdc8dd78fc81%%
Inserted
37
Waiting...
37
Waiting...
37

驱动器已连接。软盘已删除

Waiting...
37
Waiting...
37
Waiting...
37
Waiting...

编辑:2018年8月20日

我回答了我自己的问题。我的方法存在两个错误。首先是我从/dev/disk2中读取,它实现了缓存,而不是/dev/rdisk2,它没有实现缓存。第二个问题是我将打开的文件句柄留在设备上,使其处于无效状态。现在,使用try / catch / finally可以确保尽管有预期的IOExceptions,我的FileReader的{​​{1}}始终关闭。这是修改后的代码。

/dev/rdisk2

0 个答案:

没有答案