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();
		}
	}

}

//=================================================================================================================

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

ты в Сан то есть в Оракл такое пошли — там люди башковитые -оценят

Так в Sun или в Oracle? Вы уж разберитесь куда, я отошлю.

не то что быдлокодеры среднего звена:)

Я надеюсь это вы не про себя.)

В nio реализовано как-то неудобно. Решил написать свой. Кому

Уже вижу что некому.)

Возникает логичный вопрос: «Нах... что-то писать, если даже разобраться мозгов не хватает».

Клавиша залипла cut-and-paste делать. Почисти.

@m@} {
ты в Сан то есть в Оракл такое пошли — там люди башковитые -оценят не то что быдлокодеры среднего звена:)
@m@} {В nio реализовано как-то неудобно. Решил написать свой. Кому

@m@} { Возникает логичный вопрос: «Нах... что-то писать, если даже разобраться мозгов не хватает».

Просто чесно кажучи лінь дивитися твій код.

А тебя и не заставляют “дивитися” мой код. Возникает логичный вопрос: “Нах... что-то писать, если даже разобраться мозгов не хватает”.

І ще одне. як залокати файл від читання, не локаючи його від запису)

А не простіше зробити наприклад сигнлтон в який будеш заганяти в якийсь хештейбл імена залоканих файлів (або просто обєкти File і порівнювати їх адреси)?

Просто чесно кажучи лінь дивитися твій код. і не всі ОС адекватно реагують на локи наскільки я знаю.

Підписатись на коментарі