0

同時に実行するように設計された2つのアプリを作成し(それらを組み合わせたくない)、1つは特定のファイルから読み取り、もう1つはそのファイルに書き込みます。どちらか一方がエラーを実行していない場合でも、両方が実行されている場合は、アクセスが拒否されたというエラーが発生します。最初の関連コード:

    class MakeImage implements Runnable {
        @Override
        public void run() {
            File file = new File("C:/Users/jeremy/Desktop/New folder (3)/test.png");
            while (true) {


                try{
//make image
                if(image!=null)
                {
                    file.createNewFile();
                ImageIO.write(image, "png", file);
                hello.repaint();}}
                catch(Exception e)
                {
                    e.printStackTrace();
                }

                }
    }
}   

2番目の関連コード:

            BufferedImage image = null;
            try {
                // Read from a file
                image = ImageIO.read(new File("C:/Users/jeremy/Desktop/New folder (3)/test.png"));
            }
            catch(Exception e){
                e.printStackTrace();
            }
            if(image!=null)
            {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write( image, "png", baos );
            baos.flush();
            byte[] imageInByte = baos.toByteArray();
            baos.close();
            returns=Base64.encodeBase64String(imageInByte);
            }

私はこれを見ました:Java:同じファイルを変更しようとしている2つのプロセスを処理する方法、しかしそれは両方がここに1つしかないファイルに書き込みをしているときです。前者の答えで提案されているように、後で再試行する方法を試してみましたが、運がありませんでした。どんな助けでも大歓迎です。

4

3 に答える 3

3

何らかのOSレベルのファイルロックを使用してロックをチェックしない限り、これを簡単に確実に行うことはできません。これを管理するためのかなり信頼できる方法は、ディレクトリ内の別のファイルをセマフォとして使用し、書き込みまたは読み取り中に「タッチ」し、完了したら削除することです。ファイルにアクセスする前に、セマフォの存在を確認してください。それ以外の場合は、ある種のデータベースを使用してファイル ロックを保存し (一貫性が保証されます)、そこでチェックする必要があります。

とはいえ、これを 1 つのプログラムに結合するだけで十分です。

于 2012-07-17T18:14:52.810 に答える
0

ファイルを変更するメソッドで使用synchronizedします。

編集:

スレッドセーフクラスの定義によると、このように..「クラスはスレッドセーフであると言われ、クライアント側からの同期メカニズムの手段を使用せずに、基礎となるOSのインターリーブとスケジューリングが存在する場合に正しく機能します」 .

別のマシンにアクセスするファイルがあると信じているので、そこにある場合はクライアントサーバーメカニズムが必要です..サーバー側に同期メカニズムを持たせれば、クライアントの数は関係ありませんアクセス...

そうでない場合は、同期で十分です........

于 2012-07-17T18:10:00.200 に答える
0

RandomAccessFileを試してください。

これは便利ですが、非常に危険な機能です。「同じファイルに対して RandomAccessFile の異なるインスタンスを作成すると、ファイルの異なる部分に同時に書き込むことができます」のようになります。
seek メソッドを使用してファイルのさまざまな部分を指す複数のスレッドを作成でき、複数のスレッドが同時にファイルを更新できます。Seek を使用すると、ファイルが存在しない場合でも (EOF の後)、ファイルの任意の部分に移動できるため、新しく作成されたファイルの任意の場所に移動して、その場所にバイトを書き込むことができます。同じファイルの複数のインスタンスを開き、異なる場所をシークし、同時に複数の場所に書き込むことができます。

于 2012-07-17T18:15:55.473 に答える