关于java:file.exists()在文件确实存在时返回false

file.exists() returning false when the file does exist

在我正在使用的Android应用程序中,用户应该能够在SD卡上创建一个新的CSV文件,并使用他们在EditText中输入的文本来命名。

问题在于,使用目录和文件名实例化File之后,即使文件确实存在于该位置,file.exists()也会返回false。 我已经使用Android文件浏览器和Windows资源管理器浏览到SD卡,并且该文件确实存在。

这是检查文件是否已经存在的正确方法吗?如果存在,我会丢失什么内容,以便在文件存在时返回true?

1
2
3
4
5
6
7
8
9
10
String csvname = edittext.getText().toString() +".csv";
File sdCard = Environment.getExternalStorageDirectory(); //path returns"/mnt/sdcard"
File dir = new File (sdCard.getAbsolutePath() +"/Android/data/" + getPackageName() +"/files/"); // path returns"/mnt/sdcard/Android/data/com.phx.license/files"
dir.mkdirs();
File file = new File(dir, csvname); //path returns"/mnt/sdcard/Android/data/com.phx.license/files/Test.csv"

if(!file.exists()) //WHY DOES IT SAY IT DOESN'T EXIST WHEN IT DOES?
{
    ...
}


如果使用createNewFile,它将仅在尚不存在的情况下创建一个文件。

Java文件文档

公共布尔createNewFile()
引发IOException
当且仅当具有该抽象路径名的文件尚不存在时,以原子方式创建一个新的空文件。检查文件是否存在以及如果文件不存在则创建文件是单个操作,对于可能影响该文件的所有其他文件系统活动而言,这是原子操作。
注意:此方法不应用于文件锁定,因为不能使生成的协议可靠地工作。应该改用FileLock工具。

返回值:
如果命名文件不存在且已成功创建,则为true;否则为true。如果命名文件已经存在,则返回false
抛出:
IOException-如果发生I / O错误
SecurityException-如果安全管理器存在并且其SecurityManager.checkWrite(java.lang.String)方法拒绝对该文件的写访问
以来:
1.2


new File(dir, csvname);这样创建新文件对象不会在文件系统中创建新文件。

您需要先向其中写入数据。


我遇到了完全相同的问题,但是在hadoop上运行了纱,火花作业试图执行命令。

这是一个文件权限问题。我通过下面的代码在scala中对它进行了故障排除。存在和notExists都返回false,这意味着jvm无法判断文件是否存在。

1
2
3
4
5
import java.nio.file.Path
import java.nio.file.Paths

val path = Paths.get(fileLocation);
println(":"+ Files.exists(path)+":" + Files.notExists(path))