2009-08-27 4 views
4

FileLock과 함께 Windows 환경에서 Java로 파일을 잠그려고하고 있는데, 문제가 발생했습니다 : 파일을 잠근 후다른 어떤 프로세스에서 적어도 어느 정도는 액세스 할 수 있습니다.Java 파일 잠금 및 Windows - 잠금이 "절대적"이 아닙니까?

예제 코드는 다음과 같습니다

public class SimpleLockExample { 
    public static void main(String[] args) throws Exception { 
     String filename = "loremlipsum.txt"; 

     File file = new File(filename); 
     RandomAccessFile raf = new RandomAccessFile(file, "rw"); 
     FileChannel channel = raf.getChannel(); 

     FileLock lock = null; 
     try { 
      lock = channel.tryLock(); 
      String firstLine = raf.readLine(); 
      System.out.println("First line of file : " + firstLine); 
      waitForEnter(); 
      lock.release(); 
     } catch (OverlappingFileLockException e) { 
      e.printStackTrace(); 
     } 

     lock.release(); 
     System.out.println("Lock released"); 

     channel.close(); 
    } 

    private static void waitForEnter() throws Exception { 
     BufferedReader reader = 
       new BufferedReader(new InputStreamReader(System.in)); 
     reader.readLine(); 
     reader.close(); 
    } 
} 

을 지금, 나는이 예제 내 파일을 잠글 때,이 잠겨 :

이 이
  • 그것은 Windows에서 삭제할 수 없습니다
  • 이클립스가 거부 그것을 열어

... 그러나 그것은 완전히 방탄하지 않습니다 :

  • 예를 들어 Scite (텍스트 편집기)로 열면 내용이 표시되지 않지만 열어 본 내용이나 작성된 내용으로 파일을 저장하도록 선택하면 파일이 지워졌습니다 ... (내용이 없어도 Scite로 무언가를 썼다해도)

Windows에서 Java로 다른 프로세스가 파일을 덮어 쓰거나 지우는 것을 방지하는 방법이 있습니까?

내가 올바르게 이해했다면 독점적 인 잠금 기능을 사용하고 있습니다. 공유 잠금을 사용하면 더 많은 작업을 수행 할 수 있습니다.

이 테스트는 Windows에서 실행 된 2000

BR, Touko

답변

4

까다로운의 FileLock의 API 자체는 많은 약속하지 않습니다

을이 파일 잠금 API를 의도한다 기본 작동 시스템의 기본 잠금 기능에 직접 매핑하십시오. 따라서 파일에 보관 된 잠금은 언어로 작성된 언어와 관계없이 이 파일에 액세스 할 수있는 모든 프로그램에 표시되어야합니다.

로크 실제로 잠긴 영역의 콘텐츠에 액세스 에서 다른 프로그램을 방지 여부

는 시스템에 의존하고 따라서 지정된다. 일부 시스템의 파일 잠금 기능을 사용하는 자국어로만 제공되는 은 프로그램이 공동으로 이라는 알려진 잠금 프로토콜을 준수해야 데이터 무결성을 보장한다는 의미 인 을 의미합니다. 다른 시스템에서 기본 파일 잠금 의미 필수 그 하나 개의 프로그램 이 잠금을 위반하는 방식으로 그 지역에 접근 한 후 다른 프로그램이 실제로 방지하는 파일의 영역을 고정합니다. 시스템의 경우 기본 파일 잠금이 권고인지 또는 필수인지 여부는 파일 단위로 으로 구성 할 수 있습니다. 플랫폼에서 동작의 일관성과 정확성을 보장하기 위해, 강력하게이 API에서 제공하는 잠금들이 자문 잠금 것처럼 사용하는 것이 을 권장합니다. 이상하게도

, 그것은 개발 때 API 잠금 파일에 대한 논의는 윈도우 OS는 자문 잠금을 필수 잠금을 제공하고 유닉스 주장했다. 그 독서에 따라서 당신의 코드가 Windows에서 잘 작동 할 것으로 기대할 수 있습니다.

편집기에서 파일을 임시 파일을 만든 다음 디렉토리 항목을 조작하여 새 버전으로 잠근 파일의 버전을 복제하는 것이 아니라고 생각합니다. Windows에서 이러한 동작을 허용합니까? 당신은 당신이 필요로하는 제어 수준을 얻기 위해 JNI에 의존해야하는 경우

이 궁금하다.

1

는 잠금을하지 않을 경우 .tryLock에 대한 귀하의()를 호출하면 null을 반환 할 수 있습니다. Javadoc의에서 : 다른 프로그램이

또한 중복 잠금을 보유하고 있기 때문에 잠금이 획득 할 수없는 경우

새로 획득 락을 나타내는 락 객체는, 또는 당신의 코드는 현재 파일을 널 열립니다 그리고 나서 잠금을 획득하려고 시도합니다. 대신 자물쇠를 얻기 위해 반복해야하고, 일단 가지고 있다면, 파일을 열고, 파일을 읽고, 파일을 닫고, 자물쇠를 포기하십시오. finally {} 절에서 잠금을 포기하십시오. 코드가 잠금을 유지 한 상태에서 예외를 throw하는 경우에 대비하십시오. (일부 파일이 잠겨 있기 때문에 Windows 시스템을 재부팅해야합니까?)