问题描述
当我尝试使用 file.list()
列出外部存储上文件夹的内容时,该方法始终返回 null
。该文档并没有真正帮助。它说:
如果此抽象路径名不表示目录,或者发生 I/O 错误,则返回 null。
在我的例子中,抽象路径名确实表示一个目录(根据 Java 本身)并且权限似乎很好。
任何帮助将不胜感激。到目前为止,我找到了仅适用于 Android 的解决方案。我正在使用带有 JDK 15 的 macOS Big Sur 11.4(我没有要测试的 linux 或 windows 机器)。
import java.io.File;
import java.util.Arrays;
class Main
{
public static void main(String[] args)
{
var path = "/Volumes/MyStorage";
var file = new File(path);
System.out.println("Username: " + System.getProperty("user.name"));
System.out.println("File exists: " + file.exists());
System.out.println("File is a directory: " + file.isDirectory());
System.out.println("List of files: " + Arrays.toString(file.list()));
}
}
输出:
Username: username
File exists: true
File is a directory: true
List of files: null
权限看起来不错:
$ ls -la /Volumes/
total 0
drwxr-xr-x 4 root wheel 128 May 29 21:08 .
drwxr-xr-x 20 root wheel 640 Jan 1 2020 ..
drwxrwxr-x 13 username staff 510 May 29 20:52 MyStorage
lrwxr-xr-x 1 root wheel 1 May 26 10:15 Macintosh HD -> /
作为 username
,我可以访问 MyStorage 的整个结构。我可以使用 ls /Volumes/MyStorage
列出磁盘的内容。
编辑:
根据评论中的要求,这里是我使用 Files.list(Path.of(path))
得到的错误的堆栈跟踪:
java.nio.file.filesystemexception: /Volumes/MyStorage: Operation not permitted
at java.base/sun.nio.fs.UnixException.translatetoIOException(UnixException.java:100)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
at java.base/sun.nio.fs.UnixFileSystemProvider.newDirectoryStream(UnixFileSystemProvider.java:411)
at java.base/java.nio.file.Files.newDirectoryStream(Files.java:476)
at java.base/java.nio.file.Files.list(Files.java:3765)
at Main.main(Main.java:22)
考虑到文件夹的权限看起来不错,这非常令人费解。此外,其他语言在列出文件夹(C、Python 和其他语言)时也没有问题。我尝试将正在工作的 python 脚本作为 Java 中的子进程运行,但它不起作用(文件夹显示为空)。
编辑 2:
到目前为止,我一直在 NetBeans 中运行 Java 应用程序。但是,如果我通过 shell (java -jar myapp.jar
) 运行 Java 应用程序,则它可以工作:
$ java -jar TestApplication.jar
Username: username
File exists: true
File is a directory: true
List of files: [.DocumentRevisions-V100,.DS_Store,.fseventsd,.Spotlight-V100,.TemporaryItems,.Trashes,private,work]
NetBeans(只有 netbeans?)是否可能没有列出文件夹的权限?
编辑 3:
感谢 dan1st,缩小问题范围。当我用 packr
打包应用程序并运行 .app
文件时,macOS 要求我授权我列出可移动存储(黑色矩形隐藏我的应用程序名称):
如果我点击“确定”,那么它会按预期工作。不幸的是,我们无法手动为 NetBeans 添加这些授权。也许这是“Ask Different”的问题?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)