この記事では、Javaの排他的ファイルライティングを解決するための5つの方法について説明します。不適切なものがあれば、それを提案してください。
ソリューション1: randomAccessFileのファイル操作オプションを使用すると、Sは同期ロックモードで書き込むことを意味します
randomAccessFile file = new RandomAccessFile(file、 "rws");
ソリューション2: FileChannelのファイルロックを使用します
file file = new file( "test.txt"); fileinputStream fis = new fileinputStream(file); filechannel channel = fis.getChannel(); filelock filelock = null; // trueは共有ロックを意味し、Falseは排他的ロックです(Filelock!= null)break; else //ロックスリープを占める他のスレッド(1000);}
ソリューション3:最初にコンテンツを一時ファイルに書き込み、次に一時ファイルの名前を変更します(ハックスキームはバッファリング +アトミック操作の原則を使用します)
パブリッククラスmyfile {private string filename; public myfile(string filename){this.filename = filename; } public synchronized void writedata(string data)throws ioexception {string tmpfilename = uuid.randomuuid()。toString()+"。tmp";ファイルtmpfile = new file(tmpfilename); filewriter fw = new filewriter(tmpfile); fw.write(data); fw.flush(); fw.close(); //今ではTEMPファイルを目的の名前に変更します。この操作は、ほとんどのOSの場合の原子動作です。ソリューション4:ファイルパスに従ってファイルをカプセル化し、同期してファイルの書き込みを制御するために使用します
パブリッククラスmyfile {private string filename; public myfile(string filename){this.filename = filename; } public Synchronized void writedata(string data)throws ioexception {filewriter fw = new filewriter(filename); fw.write(data); fw.flush(); fw.close(); }}プラン5:私が思いついた計画はそれほど正確ではありません。読み取りおよび書き込み許可の制御を設定するように切り替えることにより、書き込み可能なマーカーの設定をシミュレートします(オペレーティングシステムの古典的な読み取りと書き込みの問題に変換...)
パブリッククラスmyfile {private volatile boolean canwrite = true;プライベート文字列ファイル名; public myfile(string filename){this.filename = filename; } public void writedata(string data){while(!canwrite){try {thread.sleep(100); } catch(interuptedexception ie){} //タイムアウト書き込み時間を設定できます} canwrite = false; //今すぐファイルcanwrite = true; }}上記は、Javaがファイルのみを作成するためのソリューションです。あなたはそれを学びましたか?他の記事を参照して、それを学び、理解することができます。