2011-08-17 295 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

相关问题