Read/Write locks for files in java
Недавно столкнулся с необходимостью RW lock-ов для файлов в java. В nio реализовано как-то неудобно. Решил написать свой. Кому интересно юзайте.
//=================================================================================================================
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.channels.OverlappingFileLockException;
import java.nio.channels.ReadableByteChannel;
import java.util.concurrent.TimeUnit;
/**
* Immutable class for file based Read/Write lock.
*
* Usage:
*
* FileReadWriteLock rwLock = null;
*
* try{
* rwLock = acquireLock( inputStream );
* }
* finally {
* rwLock.release();
* }
*
*
* @author
*
*/
public final class FileReadWriteLock {
public static FileReadWriteLock acquireLock( FileChannel fileChannel ){
FileReadWriteLock rwLock = null;
if( fileChannel instanceof ReadableByteChannel ){
rwLock = new FileReadWriteLock( fileChannel, true );
}
else {
rwLock = new FileReadWriteLock( fileChannel, false );
}
return rwLock;
}
public static FileReadWriteLock acquireLock( FileInputStream inStr ){
return new FileReadWriteLock( inStr.getChannel(), true );
}
public static FileReadWriteLock acquireLock( FileOutputStream outStr ){
return new FileReadWriteLock( outStr.getChannel(), false );
}
public FileReadWriteLock release(){
if( fileLock != null ){
try{
fileLock.release();
}
catch( IOException ioEx ){
ioEx.printStackTrace();
}
}
return this;
}
//==== PRIVATE ====
private static final int RETRY_LOCK_DELAY = 500; // 500 ms
private final FileChannel fileChannel;
private final FileLock fileLock;
private FileReadWriteLock( FileChannel fileChannel, boolean shared ){
this.fileChannel = fileChannel;
fileLock = createFileLock( shared );
}
private FileLock createFileLock( boolean shared ){
FileLock tempFileLock = null;
while( ! Thread.currentThread().isInterrupted() ){
try{
tempFileLock = fileChannel.lock(0L, Long.MAX_VALUE, shared);
if( tempFileLock != null ){
break;
}
}
catch( OverlappingFileLockException overlupEx ){
// Ignore OverlappingFileLockException exception
sleep();
}
catch( Exception ioEx ){
throw new IllegalStateException( "Can't obtain FileLock", ioEx );
}
sleep();
}
return tempFileLock;
}
private void sleep(){
try{
TimeUnit.MILLISECONDS.sleep(RETRY_LOCK_DELAY);
}
catch( InterruptedException interEx ){
Thread.currentThread().interrupt();
interEx.printStackTrace();
}
}
}
//=================================================================================================================
5 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарівТак в Sun или в Oracle? Вы уж разберитесь куда, я отошлю.
Я надеюсь это вы не про себя.)
Уже вижу что некому.)
Клавиша залипла cut-and-paste делать. Почисти.
ты в Сан то есть в Оракл такое пошли — там люди башковитые -оценят не то что быдлокодеры среднего звена:)
@m@} {В nio реализовано как-то неудобно. Решил написать свой. Кому
@m@} { Возникает логичный вопрос: «Нах... что-то писать, если даже разобраться мозгов не хватает».
А тебя и не заставляют “дивитися” мой код. Возникает логичный вопрос: “Нах... что-то писать, если даже разобраться мозгов не хватает”.
І ще одне. як залокати файл від читання, не локаючи його від запису)
Просто чесно кажучи лінь дивитися твій код. і не всі ОС адекватно реагують на локи наскільки я знаю.