Java与Android删除由FileInputStream打开的文件

时间:2015-07-16 14:24:49

标签: java android

我有一个代码片段,它将通过输入/输出流打开一个本地文件,但它会睡眠或等待片刻(此时,流仍然打开,而不是关闭),而我将该文件删除文件管理程序。 Java和Android之间的行为似乎不同。

Java:无法删除该文件,因为另一个程序正在访问它 - FileInputStream仍未关闭

   File f = new File("D:\\" + File.separator + "testfile.txt");
   try {
        f.createNewFile();
        FileInputStream fis = new FileInputStream(f);
        // Still not close
        try {
            Thread.sleep(60000); // At this time I will use another program to delete this file
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

Android:该文件可以正常删除 - 尽管FileInputStream仍未关闭

    File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "testfile.txt");
    try {
        f.createNewFile();
        FileInputStream fis = new FileInputStream(f);
        // Still not close
        try {
            Thread.sleep(60000); // At this time I will use another program to delete this file
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

任何人都可以向我解释为什么这些平台之间存在差异?我只知道android重用java sdk,可能是他们的行为在从java迁移到android时被修改了?还是另一个原因......?

2 个答案:

答案 0 :(得分:2)

  

任何人都可以向我解释为什么这些平台之间存在分歧

Linux(与Android和Mac OSX) 1 与Windows相比实际上有所不同。

  • Linux等通过"取消链接"实现文件删除该文件,只有在关闭所有文件句柄时才实际删除它。

  • 在Windows中(至少在历史上),删除文件然后将其删除,因此删除已打开的文件是可实现的。这已经改变,但删除的限制仍然存在。 (请参阅MSDN的"DeleteFile function"页面。)

1 - Linux,Android和Mac OSX操作系统的设计都来自经典的UNIX,UNIX使用了" unlink"至少从版本6开始,文件删除的语义.Windows最终来自MS / DOS。

答案 1 :(得分:0)

正如m0skit0指出的那样,这不是Java与Java @ Android的区别。如果您在Linux上尝试Android示例,您将获得相同的结果。

Java在文件操作方面依赖于底层操作系统的行为,这就是Windows(您的第一个示例)和Linux不同的地方(至少与其对应的默认/标准文件系统不同)。