2012-10-04 4 views
4

나는 최근에 내 다운로더 AsyncTask를에 filelocks을 추가했다.파일을 자르지 않고 FileLock을 확인하는 방법은 무엇입니까?</p> <pre><code>FileOutputStream file = new FileOutputStream(_outFile); file.getChannel().lock(); </code></pre> <p>및 다운로드가 완료된 후, <code>file.close()</code> 잠금을 해제 :

호출 된 BroadcastReceiver (다른 스레드)에서 파일을 검토하여 다운로드 된 파일과 잠겨있는 파일을 확인해야합니다. 나는 설정된 tryLock 시작 :

for (int i=0; i<files.length; i++) { 
    try { 
     System.out.print((files[i]).getName()); 
     test = new FileOutputStream(files[i]); 
     FileLock lock = test.getChannel().tryLock(); 
     if (lock != null) { 
      lock.release(); 
      //Not a partial download. Do stuff. 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     test.close(); 
    } 
} 

불행히도 나는 파일 (0 바이트) 잘립니다 읽기 FileOutputStream에 만들 때. 첨부하도록 설정했지만 잠금이 적용되지 않는 것 같습니다. 모두 잠금 해제 된 것으로 표시됩니다 (완전히 다운로드 됨).

쓰기 잠금이 파일에 적용되는지 확인하는 다른 방법이 있습니까 현재, 아니면 여기에 잘못된 방법을 사용하고 있습니까? 또한, ADB 터미널이나 Eclipse에서 파일 잠금을 디버깅하는 방법이 있습니까?

답변

2

없음 작업을 진행하지 않습니다 당 APPEND 위해 열하는 것이다. Javadoc을 확인하십시오. 잠금은 전체 프로세스 (예 : JVM) 대신 개별 스레드가 보유합니다.

+1

난 이해가 안돼, 나는 * 내 애플 리케이션의 프로세스를 대신하여 자물쇠를 개최 * 싶어요. – NoBugs

+0

스레드가 자신을 위해서만 잠그고 싶은 이유가 무엇인지 잘 모르겠지만 그것이 무엇을하고있는 것처럼 보입니다. 파일을 사용중인 것으로 표시하는 더 나은 방법을 알고 있습니까? – NoBugs

+0

@NoBugs 아니요. 스레드 A가 잠금을 보유하고 스레드 B가 스레드 A가 잠금을 해제 할 때까지 잠금을 얻지 못하게하려고합니다. 중요한 점은 tryLock()은 프로세스가 전체적으로 이미 잠금을 가지고 있기 때문에 항상 성공한다는 것입니다. 귀하의 코드는 실패, 즉 null을 반환합니다. – EJP

2

내 첫번째 생각이의 javadocs

test = new FileOutputStream(files[i], true); // the true specifies for append 
+0

니스, 이제 파일을 삭제하지 않지만 잠금을 인식하지 못하는 것 같습니다. 모든 파일이 잠금 해제 된 것처럼 보입니다. – NoBugs

+1

EJP에서 설명한 문제가 발생할 수 있습니다. 프로세스마다 잠금이 유지되면 프로세스의 다른 스레드가 이미 잠근 경우에도 잠금을 요청할 수 있습니다. 불행히도, 나는 그 부분에 대한 답이 없습니다. – RHSeeger