我有一个代码片段,它将通过输入/输出流打开一个本地文件,但它会睡眠或等待片刻(此时,流仍然打开,而不是关闭),而我将该文件删除文件管理程序。 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时被修改了?还是另一个原因......?
答案 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不同的地方(至少与其对应的默认/标准文件系统不同)。