문제

CRON에서 자주 호출되는 프로세스가있어 관련 명령이 특정 이동 명령이있는 파일을 읽습니다. 내 프로세스는이 데이터 파일을 읽고 써야 하며이 시간 동안 다른 프로세스가 터치하지 않도록 잠금을 유지해야합니다. 완전히 별도의 프로세스는 사용자가 동일한 데이터 파일에 (잠재적) 쓰기/추가하기 위해 실행할 수 있습니다. 이 두 프로세스가 멋지게 재생되고 한 번에 하나씩 파일에만 액세스하기를 원합니다.

Nio filelock은 내가 필요한 것 (내 자신의 세마포어 유형 파일을 쓰는 것이 부족한 것 같음) 인 것처럼 보였지만, 읽기를 위해 그것을 잠그는 데 어려움을 겪고 있습니다. 잠금 상태에서 잘 쓸 수 있지만 읽을 때 잠금을 만들려고 할 때 WritableChannelException을 얻습니다. 읽기를 위해 파일을 잠글 수 있습니까? RandomAccessFile이 내가 필요한 것과 더 가깝게 보이지만이를 구현하는 방법은 모르겠습니다.

다음은 실패한 코드입니다.

FileInputStream fin = new FileInputStream(f);
FileLock fl = fin.getChannel().tryLock();
if(fl != null) 
{
  System.out.println("Locked File");
  BufferedReader in = new BufferedReader(new InputStreamReader(fin));
  System.out.println(in.readLine());
          ...

예외는 FilElock 라인에서 발생합니다.

java.nio.channels.NonWritableChannelException
 at sun.nio.ch.FileChannelImpl.tryLock(Unknown Source)
 at java.nio.channels.FileChannel.tryLock(Unknown Source)
 at Mover.run(Mover.java:74)
 at java.lang.Thread.run(Unknown Source)

Javadocs를보고 있습니다

원래 글쓰기를 위해 열리지 않은 채널에 쓰려고 시도 할 때 확인되지 않은 예외가 발생했습니다.

그러나 나는 반드시 그것을 쓸 필요는 없습니다. FileoutPustream 등을 작성하려고 할 때 작성 목적으로 같은 파일에서 fileInputStream을 열 때까지 행복합니다.

도움이 되었습니까?

해결책

(a) 파일을 잠그면 다른 프로세스가 잠금을 사용하지 않는 한 다른 프로세스가 접촉하는 것을 막을 수 없다는 것을 알고 있습니까?
(b) 쓰기 가능한 채널을 통해 잠금해야합니다. a를 통해 자물쇠를 얻으십시오 RandomAccessFile "RW"모드에서 다음을여십시오 FileInputStream. 둘 다 닫으십시오!

다른 팁

사용을 사용하여 잠금을 만들면 더 나을 것입니다. tryLock(0L, Long.MAX_VALUE, true).

이것은 읽기에 맞는 일을 공유하는 잠금 장치를 만듭니다.

tryLock() 속기입니다 tryLock(0L, Long.MAX_VALUE, false), 즉, 독점적 인 쓰기 잠금을 요청합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top