【问题标题】:How do tell if a file is opened for reading/writing in Android?如何判断文件是否在 Android 中打开以进行读/写?
【发布时间】:2011-10-29 06:09:39
【问题描述】:

这是一个代码 sn-p,我正在打开一个文件以同时使用两个 FileOutputStreams 进行写入。

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

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

【问题讨论】:

    标签: java android io android-file


    【解决方案1】:

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

    另一个实例是什么意思?

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

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

    【讨论】:

    • 难道没有办法说“我要读取那个文件,请确保其他进程在我完成之前无法写入它”?我正在使用 SharedPreferences 一段时间后它们会丢失,但在使用 Android API 时我无法为它们使用 FileLock。
    【解决方案2】:

    FileObserver 可能会对您有所帮助。

    【讨论】:

    • 有 2 个进程(相同的应用程序)读取相同的首选项文件,我尝试使用 FileObserver 重新加载首选项。事实证明这是完全不可靠的(没有找出原因),并且一个进程在被另一个进程修改后没有重新加载首选项!甚至认为我确保观察者保持活力。
    【解决方案3】:

    你可以只执行一个空检查

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

    如果 fis 之前打开过,它就不会为 null,并且您最终不会打开另一个输出流。

    【讨论】:

    • 你显然误读了这个问题......那里有fisfis2......
    猜你喜欢
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    相关资源
    最近更新 更多