0

他の VM の他のプロセスが同じことをしようとしている間に、ファイルにアクセスする Java アプリケーションを作成しました。したがって、FileLock クラスを使用します。

FileOutputStream fos = new  FileOutputStream(filePath,append);
    FileChannel f = fos.getChannel();
    FileLock lock;

    while ((lock = f.tryLock()) == null){
        try {
            Thread.sleep(100);
        } catch (InterruptedException ex) {
            Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    OutputStreamWriter out = new OutputStreamWriter( new FileOutputStream(filePath,append));
    out.write(textToWrite);
    out.close();
    lock.release();

Mac OSX ではすべて正常に動作しますが、Windows 7 でコードを実行すると、次の行で IOException がスローされます。

out.close();

、フラッシュしようとしたとき。

java.io.IOException: The process cannot access the file because another process has locked a portion of the file
at java.io.FileOutputStream.writeBytes(Native Method)

私が理解している限り、FileLock はどのように機能しますか? 、ロックの実際の取得

f.tryLock()

別のプロセス(明らかにこれ)が排他ロックを持っているため、アクセスすることを禁じています。

これはパラドクソンのように私を襲います-ロックを取得する実際の行為が私を妨げると同時に、他のプロセスがそれをいじる危険なしにファイルに書き込むことができるようにするために、排他的ロックを取得するにはどうすればよいでしょうか?

その結果、Windows ではなく Mac OS で動作するのはなぜですか? JavaDocs から、FileLock クラスには OS 固有の違いと問題があることを知っていますが、その設計目的の機能に関しては確かにそうではありません。これは当てはまらないので、私は何か間違ったことをしています。ここであなたの助けを求めます.

Thx、M

4

1 に答える 1

0

UNIX にはファイル ロックはありませ。実際、UNIX では、プロセスの下からファイルを削除することができますが、気付かないこともあります。
そのため、存在を確認できるロック ファイルを使用する必要があります。
逆説的に、コードは Windows では機能しますが、UNIX (つまり Mac OS) では機能しません。例外は、別のプロセスによってロックされているファイルに書き込もうとした結果として予期されるものです。

于 2013-02-20T10:49:40.370 に答える