2016-07-29 4 views
1

これは、ファイルに行を追加するのがわかりました。 (と、それが存在しない場合は、ファイルを作成する)FileLockでファイルに行を追加する

String message = "bla"; 
Files.write(
    Paths.get(".queue"), 
    message.getBytes(), 
    StandardOpenOption.CREATE, 
    StandardOpenOption.APPEND); 

しかし、私はその周りにロック(OS)を追加する必要があります。私はFileLockの例を参照してきましたが、Oracle Javaチュートリアルでは標準的な例は見つかりませんでした。そのAPIは私にはかなりわかりません。

答えて

2

ストリームチャネルを取得してロックするファイルをロックすることができます。また、あなたはなりたいどのように滑らかに応じtryLockを使用することができます

new FileOutputStream(".queue").getChannel().lock(); 

何かがのラインをamongs。この例では、私はあなたのオープニングのオプションを追加するためにFiles.newOutputStreamを使用することを

try(final FileOutputStream fos = new FileOutputStream(".queue", true); 
    final FileChannel chan = fos.getChannel()){ 
    chan.lock(); 
    chan.write(ByteBuffer.wrap(message.getBytes())); 
} 

は予告:

は今書いて、ロックするために、あなたのコードは次のようになります。

+0

は編集し、コンピュータへのガットのアクセスを@fred:より多くのあなたは、このチュートリアルを通過することができますについては

try { // Get a file channel for the file File file = new File("filename"); FileChannel channel = new RandomAccessFile(file, "rw").getChannel(); // Use the file channel to create a lock on the file. // This method blocks until it can retrieve the lock. FileLock lock = channel.lock(); /* use channel.lock OR channel.tryLock(); */ // Try acquiring the lock without blocking. This method returns // null or throws an exception if the file is already locked. try { lock = channel.tryLock(); } catch (OverlappingFileLockException e) { // File is already locked in this thread or virtual machine } // Release the lock - if it is not null! if(lock != null) { lock.release(); } // Close the file channel.close(); } catch (Exception e) { } 

。つまり、必要な唯一のオプションがappendなら、コンストラクタの1つがappendフラグを期待するため、ブール値を直接渡すことができます。 –

2

このコードの周囲にはありません。あなたはFileChannel経由でファイルを開く必要があり、ロックを取得し、書き込みを行い、ファイルを閉じます。必要に応じて、ロックを解除してファイルを開いたままにしておけば、次回ロックするだけで済みます。ファイルロックは、あなたが投稿したようなコードに対してではなく、他のファイルロックに対してあなたを保護するだけであることに注意してください。

関連する問題