文件存在和IS目录,但listFiles()返回null

File.listFiles()的文档表明,只有在调用它的文件不是目录的情况下才会返回null

我有以下几点:

 String dir = "/storage/emulated/0"; File f = new File(dir); Log.v("Files",f.exists()+""); Log.v("Files",f.isDirectory()+""); Log.v("Files",f.listFiles()+""); 

日志内容如下:

 true true null 

由于某些原因,即使File被识别为有效的目录, listFiles( )也会返回null 。 我对Android文件层次结构行为不是很熟悉,所以我猜想问题出在那里。

作为参考,我正在debugging我的Moto X,结果是相同的,无论手机是否插入到我的电脑 – 所以我不认为它必须与挂载时插入。

对于有这个问题的人,把这个添加到AndroidManifest.xml中:

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

解决的问题:D

编辑:如果这不起作用只是确保path是否正确

从File'listFiles'方法文档:如果此抽象path名不表示一个目录,或者发生I / O错误,则返回null。

所以也许发生了一个I / O错误。 检查该目录的权限,运行java程序的用户是否有权限读取该目录? 如果没有,那么你的答案。 如果他们这样做,那么目录可能是空的。

顺便说一句,你不应该使用+“”来将某些东西转换成string,这是一个糟糕的做法,因为它比String.valueOf慢。 我将使用Apache的StringUtils将该数组连接到一个string,但这需要将该jar添加到您的类path。

对于那些有这个问题的读者来说,你可以把它添加到AndroidManifest.xml中:

 android:name="android.permission.READ_EXTERNAL_STORAGE" 

你也应该授予许可

设置>应用程序> “您的应用程序名称” >权限>存储

对于android 版本> 23 ,您需要在onresume方法中以编程方式授予运行时权限 ,如下所示,

 public final String[] EXTERNAL_PERMS = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE }; public final int EXTERNAL_REQUEST = 138; requestForPermission(); public boolean requestForPermission() { boolean isPermissionOn = true; final int version = Build.VERSION.SDK_INT; if (version >= 23) { if (!canAccessExternalSd()) { isPermissionOn = false; requestPermissions(EXTERNAL_PERMS, EXTERNAL_REQUEST); } } return isPermissionOn; } public boolean canAccessExternalSd() { return (hasPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)); } private boolean hasPermission(String perm) { return (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(this, perm)); } 

我的问题是,由于某种原因,android:sharedUserId =“android.uid.system”属性不允许应用程序读取特定设备上的/ sdcard /。

由于我只需要做一个快速的testing,我删除了sharedUserId属性,testing并添加回来。

只需在manifest uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"添加权限,问题就会解决。

<uses-permission .... >部分的清单文件中,添加这一行android:name="android.permission.READ_EXTERNAL_STORAGE" 。 我认为这可能会解决你的问题。

我在java中有一个相同的问题,但不是在Android,我正在阅读configuration文件path引号。 我刚刚删除引号解决了我的问题

所以你可以通过stringreplacefunction来实现,或者不用引号

String someString =“C:\ path”; someString = someString.replace( “\””, “”);