2013-02-20 4 views
0

다른 VM의 다른 프로세스가 파일을 액세스하는 동안 파일에 액세스하는 Java 응용 프로그램을 작성했습니다.Windows 대 OSX FileLock OutputStreamWriter

FileOutputStream fos = new FileOutputStream(filePath,append); 
    FileChannel f = fos.getChannel(); 
    FileLock lock; 

    while ((lock = f.tryLock()) == null){ 
     try { 
      Thread.sleep(100); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(filePath,append)); 
    out.write(textToWrite); 
    out.close(); 
    lock.release(); 

모든 맥 OSX에서 잘 작동하지만 윈도우 7의 코드를 실행할 때 플러시 할 때이 라인

out.close(); 

에서 IOException를 슬로우 그러므로 나는 FileLock 클래스를 사용합니다.

java.io.IOException: The process cannot access the file because another process has locked a portion of the file 
at java.io.FileOutputStream.writeBytes(Native Method) 

는 지금까지 내가 How does FileLock work?에서 이해, 실제 배타적 잠금이있다 (분명히이 일을) 다른 프로세스 이후에 액세스 할 날을 금지

f.tryLock() 

과 잠금의 획득.

이제 나는 역설적 인 태도를 취합니다 - 잠금을 얻는 실제 행동이 나를 방해 할 때 동시에 다른 프로세스가 덤비는 위험없이 파일에 쓸 수있는 특별한 잠금을 얻으려면 어떻게해야합니까? 그렇게하려면?

그리고 왜 Mac OS에서 작동하고 Windows에서는 작동하지 않습니까? JavaDocs에서 OS 고유의 차이점과 FileLock 클래스의 어려움이 있음을 알고 있지만, 확실히 설계된 기능과 관련해서는 그렇지 않습니다. 이것이 사실 일 수 없기 때문에 나는 잘못된 행동을하고 있으며 이것은 내가 당신의 도움을 요청하는 곳입니다.

들으, M

답변

0

는 UNIX : http://www.coderanch.com/t/551144/java/java/File-lock-doesn-prevent-threads에 잠금 파일이 없습니다. 사실 유닉스에서는 프로세스 아래에서 파일을 삭제할 수 있으며 심지어는 프로세스를 인식하지 못할 수도 있습니다 ...
그래서 확인할 수있는 잠금 파일을 사용해야합니다.
역설적으로 코드가 Windows에서는 작동하지만 UNIX (예 : Mac OS)에서는 작동하지 않습니다. 예외는 다른 프로세스에 의해 잠긴 파일에 쓰려고 할 때 예상되는 결과입니다.

+0

답장을 보내 주시면 나는 당신과 코더 챈 포스트에 대해 완전히 이해할 지 확신하지 못한다. "파일이 잠겨 있지 않습니다"라는 뜻입니까? UNIX가 기능을 제공하지 않으므로 FileLock 클래스를 사용하여 제공해야합니다. 그리고 인수에 따라 windows는 파일 잠금 기능을 제공하므로 FileLock을 사용할 필요가 없습니다. 내가 너를 이해한다면, 더 나아가서 Windows에서 FIleLock을 사용하려고 시도해도 예외가 발생한다. – Mathew

+0

'FileLock' 클래스는 매우 특정 OS입니다 - UNIX에서는 절대적으로 아무것도하지 않습니다. 나는, 어느 정도 쓸모가 없다. Windows에서는 자신이 언급 한 게시물 에서처럼 문제가 발생했습니다. 간단히 말해서 그것은 다소 사기스러운 것입니다. 따라서 잠금 파일을 사용하는 것이 좋습니다. 즉, 어딘가에 무언가를 쓰고 외부 뮤텍스로 사용하는 것이 좋습니다. –

+0

이 기사보다 더 많은 증거가 있습니까? 광고 hominem을 용서하십시오, 그러나 나는 상당한 양의 잘못된 정보를 보았 기 때문에 coderanch.com을 특히 신뢰할만한 것으로 여기지 않습니다. 파일 잠금 방법이 사실은 유닉스 시스템의'flock()'또는'lockf()'함수 또는 이와 동등한 함수를 호출하지 않는다면 왜 [Java bug 4877242] (http : //bugs.sun. com/bugdatabase/view_bug.do? bug_id = 4877242) ("파일 잠금은 Linux에서 스레드 단위입니다")? – VGR