2

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

晚上好!

我想用一些旧的软盘作为身份证,所以我需要知道何时将一张软盘插入我的 USB 读卡器。由 Sony 制造的阅读器在 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 我现在确保我FileReader的 for/dev/rdisk2总是关闭,尽管预期 IOExceptions。这是修改后的代码。

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) {
        FileReader f = null;
        try {
            f = new FileReader(path);
            System.out.println(f.read());
            return true;
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            if (f != null) {
                try {
                    f.close();
                }
                catch (IOException e) {System.out.println("Error Closing Device!!!");}
            }
        }
        return false;
    }
4

0 回答 0