3

FileOutputStreamこれは、2 つの s を同時に書き込むためにファイルを開いているコード スニペットです。

FileOutputStream fis = null;
File openFile = new File("myfile");
try {
    fis = new FileOutputStream(openFile);
    Toast toast = Toast.makeText(getApplicationContext(), "Opened", Toast.LENGTH_SHORT);
    toast.show();
}
catch (FileNotFoundException e1) {
    Toast toast = Toast.makeText(getApplicationContext(), "FileNotFound", Toast.LENGTH_SHORT);
    toast.show();
}

// now try to open it again
FileOutputStream fis2 = null;
try {
    fis2 = new FileOutputStream(openFile);
    Toast toast = Toast.makeText(getApplicationContext(), "Opened2", Toast.LENGTH_SHORT);
    toast.show();
}
catch (Exception e1) {
    Toast toast = Toast.makeText(getApplicationContext(), "Exception: " + e1.getMessage(), Toast.LENGTH_SHORT);
    toast.show();
}

Toast「Opened」と「Opened2」という 2 つのメッセージが表示されます。

別のインスタンスによって現在書き込み用に開かれているファイルを読み取り/書き込み/削除用に開かないようにする必要があります。現在書き込み用に開いているファイルを変更しないようにするにはどうすればよいですか?

4

3 に答える 3

2

別のインスタンスによって現在書き込み用に開かれているファイルを読み取り/書き込み/削除用に開かないようにする必要があります。

別のインスタンスとはどういう意味ですか?

  • これがアプリケーションの別のスレッドである場合は、読み取り/書き込みメソッドの同期を使用します。
  • これが自分で作成した別のプロセス (アプリケーション、サービスなど) である場合は、exclusive を使用FileLockして、プロセス間のファイルの読み取り/書き込み操作を調整します。
  • これがあなたが制御していない別のプロセス (つまり、他の誰かによって作成されたプロセス) である場合は、 lsofユーティリティが行う/proc/…/fd/ように、ツリーを調べてファイルが現在開いているかどうかを確認できます。ただし、これには通常、root 権限が必要です。

それがあなたの手がかりになることを願っています。さらにサポートが必要な場合はお知らせください。

于 2011-10-03T18:33:16.927 に答える
1

FileObserverが役立つかもしれません。

于 2011-08-17T22:22:58.887 に答える
0

nullチェックを実行するだけです

if (null == fis)
// then create output stream

fis が以前に開かれていた場合、null にはならず、別の出力ストリームを開くことにはなりません。

于 2011-08-17T20:20:59.740 に答える