文件存在和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( “\””, “”);