2011-08-17 111 views
2

這是一個代碼片段,我正在打開一個文件,用於同時寫入兩個FileOutputStream如何判斷文件是否在Android中進行讀寫?

FileOutputStream fis = null; 
File openFile = new File("myfile"); 
try { 
    fis = new FileOutputStream(openFile); 
    Toast toast = Toast.makeText(getApplicationContext(), "Opened", Toast.LENGTH_SHORT); 
    toast.show(); 
} 
catch (FileNotFoundException e1) { 
    Toast toast = Toast.makeText(getApplicationContext(), "FileNotFound", Toast.LENGTH_SHORT); 
    toast.show(); 
} 

// now try to open it again 
FileOutputStream fis2 = null; 
try { 
    fis2 = new FileOutputStream(openFile); 
    Toast toast = Toast.makeText(getApplicationContext(), "Opened2", Toast.LENGTH_SHORT); 
    toast.show(); 
} 
catch (Exception e1) { 
    Toast toast = Toast.makeText(getApplicationContext(), "Exception: " + e1.getMessage(), Toast.LENGTH_SHORT); 
    toast.show(); 
} 

我最終得到了兩個Toast消息「Opened」和「Opened2」。

我需要確保我沒有打開一個文件來讀取/寫入/刪除當前打開的另一個實例寫入。如何確保我不修改當前可以寫入的文件?

回答

2

我需要確保我沒有打開一個文件來讀取/寫入/刪除 ,該文件當前已被另一個實例寫入。

你是什麼意思的另一個實例?

  • 如果這是您的應用程序中的另一個線程,請使用讀取/寫入方法的同步。
  • 如果這是您自己創建的另一個進程(應用程序,服務等),請使用專用的FileLock來協調進程間的文件讀/寫操作。
  • 如果這是你無法控制的另一個方法(即由其他人創建的),您可以檢查文件是否通過檢查/proc/…/fd/樹當前打開的,因爲lsof實用程序執行。但是,這通常需要您擁有root權限。

希望給你一個線索。讓我知道你是否需要進一步的幫助。

+2

+1有關lsof實用程序的信息 - 它對我的情況有所幫助 – ol0

+0

沒有辦法說「我即將閱讀該文件,請確保其他進程在完成之前無法寫入」?我正在使用SharedPreferences,並在一段時間後丟失,但在使用Android API時,我無法使用FileLock。 – 3c71

0

你可以只進行空校驗

if (null == fis) 
// then create output stream 

如果FIS以前打開,它不會是空的,你會不會落得打開另一個輸出流。

1

FileObserver可能會幫助你。

+0

有2個進程(相同的應用程序)讀取相同的首選項文件,我嘗試使用FileObserver重新加載首選項。事實證明這是完全不可靠的(沒有發現原因),一個進程在被另一個進程修改後沒有重新加載首選項!即使我認爲我確信觀察者仍然活着。 – 3c71

相關問題