【问题标题】:Tweaking the behavior of the default file system in Java 7在 Java 7 中调整默认文件系统的行为
【发布时间】:2013-10-17 11:45:22
【问题描述】:

Java 7 为编写自定义文件系统引入了一个很棒的 AP​​I。考虑一个我不想实现新文件系统的用例,我只想调整现有文件系统的行为。例如,翻转它写入/读取的每一位。

在我看来,当前的 jdk 只是没有为此提供适当的设施。 AbstractFileSystemProvider,WindowsFileSystemProvider 扩展的提供程序是包私有的,所以我不能重用它。我什至没有找到 Linux 的具体实现。

问题 #1:当前文件系统没有用于扩展的有用抽象。

假设我只为 Windows 扩展。 WindowsFileSystemProvider 是公共的,所以我实际上可以轻松地覆盖 newByteChannel 并完成它。但是唉!

问题 #2:WindowsFileSystem 是公开的,所以我实际上必须编写一个全新的 FileSystem 来引入一个新的 Provider。

是我遗漏了什么,还是这个功能完全是原始的,还没有准备好被应用程序编写者使用?

【问题讨论】:

  • 对于 1. 可以实现将所有内容简单地委托给现有系统的提供者(不幸的是,这会导致大量样板代码)。如果您希望 only 在 Windows 上具有特殊行为,它会变得很棘手,并且可能需要使用反射(这将是一种脆弱的方法,因为它可能是包私有的原因)。
  • @kiheru 正是我的意思。似乎这个特性已经存在,但是 JDK 的作者并没有付出足够的努力来真正使它易于使用。此外,他们为此发布的教程是个笑话。确实,我避免使用反射来破解东西。

标签: java io filesystems java-7


【解决方案1】:

在openjdk中联系core-libs-dev后得到如下答复:

服务提供者接口允许您替换默认提供者或对其进行干预(有关如何配置的详细信息,请参阅 FileSystems.getDefault 文档)。当您介入默认提供程序时,您就有机会进行自定义,尽管要确保您获得所有授权可能很棘手。作为起点,然后查看 jdk/test 树中的 PassThroughFileSystem,这是一些测试使用的提供程序,可能是您正在寻找的。​​p>

PassThroughFileSystem 是一个很好的参考实现,它演示了如何通过对默认提供者的适当委托来实现自定义提供者。话虽如此,我认为问题仍然存在,但至少我们有一个更好的起点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    相关资源
    最近更新 更多