2013-02-28 2 views
3

나는 내가이 링크를 보았다 우리가 독점 액세스를 위해 파일을 고정 할 수 있다고 생각합니다. 그들은 동시에이 파일에 액세스하려고 할 수 있습니다.이 경우 하나는 기다려야합니다.android에서 FileLock을 사용하는 방법은 무엇입니까? <a href="http://developer.android.com/reference/java/nio/channels/FileLock.html" rel="nofollow">http://developer.android.com/reference/java/nio/channels/FileLock.html</a></p> <p>나는이/저장 파일을 백그라운드 프로세스에서 (서비스) 모두와 실제 전경 응용 프로그램을로드 만들려면 :

Android에서 FileLock의 실제 샘플을 찾을 수 없습니다. Android에서 불가능한 많은 스레드를 읽었습니다. 그렇다면 문서에 "FileLock"섹션이있는 이유는 무엇입니까? 이것은 정상적인 Java 응용 프로그램에서 작동

답변

3

는 :

File file = ...; 
FileInputStream fis = new FileInputStream(file); // or FileOutputStream fos = new FileOutputStream(file); 
FileLock lock = fis.getChannel().lock(); // or FileLock lock = fos.getChannel().lock(); 

// do whatever you want with the file 

lock.release(); 
+0

FileOutputStream과 FileInputStream을 혼합 할 수 있습니까? 둘 다 동일한 채널 번호를 반환합니까? – frankish

+0

네, 제가 아는 한. –

+0

이렇게하면 프로세스간에 올바르게 작동합니다. 맞습니까? (제 말은 2 개의 별도 프로세스가 서로 기다릴 것입니다) – frankish

1

나는 파일이 "내부"휴대 전화 메모리에 작품을 잠금하지만 SD 카드에 작동하지 않습니다 생각합니다.

4
  1. 당신은 FileInputStream에서 작동하지 않습니다
  2. FileLock
  3. 을 차단하지 않고 차단과 lock()trylock()을 시도 할 수 있습니다.
  4. Android에서 FileLock은 프로세스간에 작동하지만 프로세스의 스레드 간에는 작동하지 않습니다.
1

FileLock은 공유 잠금으로 획득 한 경우에만 FileInputStream에서 작동합니다.

FileInputStream fis = new FileInputStream(file + ext); 
    FileChannel fileChannel = fis.getChannel(); 
    FileLock fileLock = fileChannel.tryLock(0L, Long.MAX_VALUE, /*shared*/true); 

실제로 이것은 의미가 있습니다. 공유 잠금은 여러 개의 동시 판독기가있을 수 있지만 작성자는 허용되지 않음을 의미합니다. 기본 배타 잠금은 프로세스가 쓰기에 독점적으로 액세스 할 수있게합니다. FileInputStream으로 쓸 수 없으므로 FileInputStream에 대한 공유 잠금을 획득해야합니다.