특정 작업 관련 명령이 포함 된 파일을 읽기 위해 cron에서 다소 자주 호출되는 프로세스가 있습니다. 내 프로세스는이 데이터 파일을 읽고 쓸 필요가 있으며이 시간 동안 다른 프로세스가 데이터 파일을 만지지 못하도록 잠 가야합니다. 완전히 분리 된 프로세스는 사용자가 동일한 데이터 파일에 쓰기 (쓰기) 또는 추가 (잠재적) 할 수 있습니다. 이 두 프로세스가 좋게 플레이하고 파일을 한 번에 하나씩 만 액세스하도록합니다.읽기 및 쓰기 용 Java FileLock
nio FileLock은 필자가 필요로하는 것처럼 보였지만 (자신의 세마포어 유형 파일 작성에 부족함), 읽기 위해 잠글 때 문제가 있습니다. 잠그고 쓸 수는 있지만, 읽을 때 잠금을 만들려고 할 때 NonWritableChannelException이 발생합니다. 파일을 읽기 위해 잠글 수 있습니까? 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)
JavaDoc을 보면,이 시도가 처음은 write를 위해서 오픈되어 있지 않았던 채널에 쓰기를했을 때에 슬로우
체크되지 않는 예외는 말한다.
하지만 필자는 반드시 글을 쓸 필요는 없습니다. 필자는 FileOutpuStream 등을 작성하려고 할 때 동일한 파일에서 FileInputStream을 열 때까지 행복합니다.
3 개의 param 메서드 호출, FileLock 잠금 (긴 위치, 긴 크기, 부울 공유)을 사용해 보셨나요? 필자는 전에 FileLock을 사용 해본 적이 없으므로 대답으로 게시하지는 않겠지 만 공유 잠금이 필요하고 독점 잠금이 필요하지 않은 것처럼 들리므로 그 메소드 호출을 사용하면 도움이 될 것 같습니다 그것에 자물쇠가있다. – ChadNC
그 의도는 파일의 일부분 만 잠그는 것이라고 생각합니다. 그러나 모든 파일을 잠궈 서 손상을 방지하고 싶습니다. – bobtheowl2