创建自定义Java(NIO)文件系统时出现问题

3

我正在创建一个基于链接的自定义文件系统。我已经创建了一个CustomFileSystemProvider和其他CustomFileSystem类,并覆盖了所需的方法。在CustomFileSystemProvidergetScheme()方法中,返回字符串“myfs”。

然而,当我尝试使用以下代码测试这个文件系统时:

FileSystem fs = FileSystems.newFileSystem(URI.create("myfs://a_remote_resource"), env);

我遇到一个错误。
java.nio.file.ProviderNotFoundException: Provider "myfs" not found
at java.nio.file.FileSystems.newFileSystem(FileSystems.java:341)
at java.nio.file.FileSystems.newFileSystem(FileSystems.java:276)
at Tester.main(Tester.java:30)

我在FileSystemProvider.installedProviders()返回的列表中没有看到我的自定义文件系统。我不确定需要注册什么来将自定义FS注册为“已安装提供程序”。

3个回答

4
一个 FileSystemProvider 被加载的方式在 Javadoc 的 FileSystems 中有解释:
安装的提供程序使用 ServiceLoader 类定义的服务提供者加载工具进行加载。 安装的提供程序使用系统类加载器进行加载。 如果找不到系统类加载器,则使用扩展类加载器; 如果没有扩展类加载器,则使用引导类加载器。 提供程序通常通过将它们放置在应用程序类路径或扩展目录中的JAR文件中来安装,该JAR文件包含名为 java.nio.file.spi.FileSystemProvider 的提供程序配置文件,该文件位于资源目录 META-INF / services,该文件列出了一个或多个具有零参数构造函数的 FileSystemProvider 的具体子类的完全限定名称。

1
你可以使用Google自动服务来完成此操作:
将您的FileSystemProvider实现类进行如下注释:
@AutoService(FileSystemProvider.class)

那么您就不需要在META-INF文件中瞎弄了。


-4

这是一个错误的URL。请将URL更改为标准URL。您还可以提供分析器。

URL aURL = new URL("http://java.sun.com:80/docs/books/tutorial" + "/index.html?name=networking#DOWNLOADING");

System.out.println("protocol = " + aURL.getProtocol());

System.out.println("authority = " + aURL.getAuthority()); System.out.println("host = " + aURL.getHost());

System.out.println("port = " + aURL.getPort());

System.out.println("path = " + aURL.getPath());

System.out.println("query = " + aURL.getQuery());

System.out.println("filename = " + aURL.getFile());

System.out.println("ref = " + aURL.getRef());

结果如下:

ut:ut:protocol = http
ut:ut:authority = localhost:8080
ut:ut:host = localhost
ut:ut:port = 8080
ut:ut:path = /UT2.0/login.action
ut:ut:query = null
ut:ut:filename = /UT2.0/login.action
ut:ut:ref = null

如果您通过互联网操作文件,请选择一种协议,例如RPC、socket等。

URI 遵循标准格式 [scheme:][//authority][path][?query][#fragment]` - Rocky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接