2

TLDR: MacOS でフロッピーをポーリングしている場合は、rdisk を使用して、そのファイルのすべてのハンドルをクリーンアップしてください。

こんばんは!

古いフロッピー ディスクを ID カードとして使用したいので、いつ USB リーダーに挿入されたかを知る必要があります。Sony 製のリーダーは、Linux と MacOS ではディスク ドライブとして表示されるので、ディスケットを挿入しても信号が得られないと思います (間違っていたら訂正してください)。そこで、世論調査に目を向けました。以下の Java を書きました。これは、FileReader を使用して raw ディスクをポーリングし、何かを読み取ってから戻ることができるようにします。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日

私は自分の質問に答えました。私のアプローチには 2 つの誤りがありました。/dev/disk21 つ目は、キャッシングを実装していて実装していないから読ん/dev/rdisk2でいたことです。2 つ目の問題は、デバイス上でファイル ハンドルを開いたままにしておくと、デバイスが無効な状態になることでした。try/catch/finally を使用して、予想される IOExceptions にもかかわらず、FileReaderfor/dev/rdisk2が常に閉じていることを確認しています。これが修正されたコードです。

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