Java:列表文件在 MacOS 上的外部存储上返回 null

问题描述

当我尝试使用 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 要求我授权我列出可移动存储(黑色矩形隐藏我的应用程序名称):

macOS asking for permission to list removable storage contente

如果我点击“确定”,那么它会按预期工作。不幸的是,我们无法手动为 NetBeans 添加这些授权。也许这是“Ask Different”的问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...