2

データベース管理システムを使用する必要があるアプリケーションを (教育目的で) 作成しています (非常に原始的な独自の DBMS を作成しました。これはタスクの一部です)。また、アプリケーションが実行されているすべてのテーブルの内容が常に正しいことを確認したいと考えています。その目的のために、各ファイルを調べて必要なチェックを行うメソッドを作成しました。問題は、アプリケーションの起動時にこのメソッドを 1 回だけ呼び出し、ファイルへのアクセスを拒否して、プログラムの実行中に誰も内容を変更しないようにすることです。

私は次のアプローチを使用します。アプリケーションの起動時に、InputStreamReaderOutputStreamWriterを初期化し、それらを保存して、アプリケーションが終了したときにのみ閉じます。

初期化メソッドの一部:

FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(file, true); 
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");

this.tables.get(table).put("fis", fis);
this.tables.get(table).put("fos", fos);
this.tables.get(table).put("isr", isr);
this.tables.get(table).put("osw", osw);

閉じる方法:

try {
    for(Map<String, Object> table_map: tables.values()) {
        OutputStreamWriter osw = (OutputStreamWriter)table_map.get("osw"); 
        InputStreamReader isr = (InputStreamReader)table_map.get("isr"); 

        if (osw != null)
            osw.close();
        if (isr != null)
            isr.close();
    }
}
catch (IOException e) {
    throw new DBException("Closing error");
}

MS メモ帳を使用してこれらのファイルのいずれかを変更しようとすると、次のエラーが表示されるため、部分的にはこのアプローチが機能します。

「別のプロセスで使用されているため、プロセスはファイルにアクセスできません」

それが私が見たいものです。しかし、Notepad++ を使用すると、アプリケーションの実行中に任意の変更を加えることができますが、それは私が期待するものではありません。では、他のプロセスが私のファイルを変更できないようにするにはどうすればよいでしょうか?

FileLockを使用しようとしましたが、間違っていなければ、自分のプロセスに対してのみアクセスが拒否されます。

私の拙い英語で申し訳ありませんが、とにかく私の質問を理解していただければ幸いです。

4

2 に答える 2

2

ドキュメントの「プラットフォームの依存関係」のセクションを読むと、次のことがjava.nio.channels.FileLockわかります。

  • FileLocks1つのJVM内でロックするためだけでなく、コンピューター上のすべてのプロセスのために使用されます。
  • ファイルロック(スペルの違いに注意)は、プラットフォームと構成に大きく依存します。

したがって、基本的には、自分自身に問いかける必要があります。本当に必要な保護は何ですか。

同じデータでプログラムを複数回実行しないようにするだけの場合は、プログラムが「正常に動作する」と想定できます

  • 使用FileLocksまたは
  • マーカーロックファイルを使用するか、
  • ファイル内で「ダーティ/ロック」マーカーを使用する

他のすべてのプログラムから保護したい場合は、Notepad ++シナリオで見たように、失われます。すべてのプラットフォームと、ロックを回避し、Javaを使用するためのすべての可能な方法を考慮すると、チャンスはありません。

于 2012-11-04T09:40:09.000 に答える
2

これが解決する価値のある問題かどうかはわかりません。どのようなアプローチをとったとしても、適切な権限を持つ誰かがファイル保護を元に戻し、とにかく変更を加えられる可能性があります。

無効なデータを適切に処理し、それ以外の場合はファイルの内容を信頼することに集中することをお勧めします。ある種の整合性チェック (行またはテーブルごと) を追加すると、誰かが誤ってまたは悪意を持ってデータを「有効」に見えるように変更することが難しくなります。

于 2012-11-04T09:02:33.297 に答える