Java 如何判断文件是否在Android中打开进行读/写?

Java 如何判断文件是否在Android中打开进行读/写?,java,android,io,android-file,Java,Android,Io,Android File,下面是一个代码片段,我在其中打开一个文件,同时使用两个FileOutputStreams进行编写 FileOutputStream fis = null; File openFile = new File("myfile"); try { fis = new FileOutputStream(openFile); Toast toast = Toast.makeText(getApplicationContext(), "Opened", Toast.LENGTH_SHORT);

下面是一个代码片段,我在其中打开一个文件,同时使用两个
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”


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

您只需执行空检查即可

if (null == fis)
// then create output stream
如果更早地打开fis,它就不会为空,您也不会打开另一个输出流。

可能会对您有所帮助

我需要确保我没有打开文件进行读/写/删除 当前已打开以供其他实例编写的

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

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

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

让两个进程(同一个应用程序)读取相同的首选项文件,我尝试使用FileObserver重新加载首选项。事实证明,这是完全不可靠的(没有找到原因),一个进程在被另一个进程修改后没有重新加载首选项!我甚至认为我确保了观察者是活着的。难道没有办法说“我即将读取该文件,请确保其他进程在我完成之前无法写入该文件”吗?我使用的是SharedReferences,过了一段时间它们就消失了,但我不能在使用Android API时为它们使用FileLock。你显然误解了这个问题。。。那里有
fis
fis2
。。。