3

这是一个代码片段,我正在打开一个文件以FileOutputStream同时使用两个 s 进行写入。

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”。

我需要确保我没有打开当前打开以供另一个实例写入的文件进行读/写/删除。如何确保不修改当前打开以供写入的文件?

4

3 回答 3

2

我需要确保我没有打开当前打开以供另一个实例写入的文件进行读/写/删除。

你说的另一个实例是什么意思?

  • 如果这是您应用程序中的另一个线程,请使用读/写方法的同步。
  • 如果这是您自己创建的另一个进程(应用程序、服务等),请使用 ExclusiveFileLock来协调进程之间的文件读/写操作。
  • 如果这是您无法控制的另一个进程(即由其他人创建),您可以通过检查/proc/…/fd/树来检查文件当前是否已打开,就像lsof实用程序一样。但是,这通常要求您具有 root 权限。

希望能给你一个线索。如果您需要进一步的帮助,请告诉我。

于 2011-10-03T18:33:16.927 回答
1

FileObserver可能会对您有所帮助。

于 2011-08-17T22:22:58.887 回答
0

你可以只执行一个空检查

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

如果 fis 较早打开,则它不会为空,并且您最终不会打开另一个输出流。

于 2011-08-17T20:20:59.740 回答