java,评估URL而不是文件的广泛使用

java,评估URL而不是文件的广泛使用,java,file,url,Java,File,Url,在java桌面应用程序中,我经常使用对文件的引用。 到目前为止,我已经尽快构建了文件对象,然后将文件对象传递给方法,例如: public void loadConfig(File configFile) { ... } 我正在评估用URL广泛替换File 这主要是因为URL可以轻松地将文件引用到zip或jar文件中。 URL是否存在安全管理器问题(在引用本地文件时),而该文件类对同一个文件不会有这些问题 由于这种重构不仅会影响实现,而且会影响接口,因此我对这种“替换”的任何其他考虑都很

在java桌面应用程序中,我经常使用对文件的引用。 到目前为止,我已经尽快构建了文件对象,然后将文件对象传递给方法,例如:

public void loadConfig(File configFile) {
    ...
}
我正在评估用
URL

广泛替换
File
这主要是因为URL可以轻松地将文件引用到zip或jar文件中。

URL是否存在安全管理器问题(在引用本地文件时),而该文件类对同一个文件不会有这些问题


由于这种重构不仅会影响实现,而且会影响接口,因此我对这种“替换”的任何其他考虑都很感兴趣

您可能会遇到的主要问题:

  • 在构建URL时,必须处理
    畸形的URL异常。文件构造函数不会引发此异常
  • 您会丢失许多基于文件的方便方法,例如:文件是否存在;它是一个文件还是一个目录;它是否可读;将文件设置为可读或可写。由于URL可能不引用文件,因此这些文件不一定适用,并且在URL API中不可用
  • 访问URL的方式会发生变化。URL有
    openStream
    openConnection
    方法;对于File,您可能会使用基于文件的流(例如,
    FileInputStream
  • 如果URL需要网络访问,而不是磁盘访问,那么您对延迟的任何假设都可能不再成立
URL类确实进行了一些SecurityManager检查,但鉴于它是一个桌面应用程序,您难道不能控制安全管理器设置吗


除此之外,由于URL是文件的超集(因为它处理
文件:
协议等),所以您应该能够以相同的方式使用它。另一种选择是尽可能使用流,而不是传递文件或URL,因为您可以根据需要使用文件或URL生成流。

您可能会遇到的主要问题:

  • 在构建URL时,必须处理
    畸形的URL异常。文件构造函数不会引发此异常
  • 您会丢失许多基于文件的方便方法,例如:文件是否存在;它是一个文件还是一个目录;它是否可读;将文件设置为可读或可写。由于URL可能不引用文件,因此这些文件不一定适用,并且在URL API中不可用
  • 访问URL的方式会发生变化。URL有
    openStream
    openConnection
    方法;对于File,您可能会使用基于文件的流(例如,
    FileInputStream
  • 如果URL需要网络访问,而不是磁盘访问,那么您对延迟的任何假设都可能不再成立
URL类确实进行了一些SecurityManager检查,但鉴于它是一个桌面应用程序,您难道不能控制安全管理器设置吗


除此之外,由于URL是文件的超集(因为它处理
文件:
协议等),所以您应该能够以相同的方式使用它。另一种选择是尽可能使用流,而不是传递文件或URL,因为您可以根据需要使用文件或URL来生成流

URL是否存在安全管理器问题(在引用本地文件时),而该文件类对同一个文件不会有这些问题

没有

沙盒应用程序。只有在自己的类路径上才能访问URL,但任何可以创建和使用
文件的内容都将以所有权限运行

URL是否存在安全管理器问题(在引用本地文件时),而该文件类对同一个文件不会有这些问题

没有


沙盒应用程序。只有在自己的类路径上才能访问URL,但任何可以创建和使用
文件的内容都将以所有权限运行。

+1以获取流的建议。它们不仅可以处理基于文件或URL的源,甚至可以处理在运行时在内存中生成的数据(
ByteArrayInputStream
)。+1,以确保准确性。“难道您不能控制安全管理器设置吗?”。我发现在java桌面领域,长期缺乏“完善的”过程。这个应用程序应该运行在3-5百台机器上,而不是单个组织的机器上。一方面,我不知道java“InstallShield”,它是一种包装我的应用程序并为我管理JVM安全管理器设置的软件。另一方面,据我所见,在客户端默认安装JRE,使应用程序在机器上具有高度的特权,我很想依靠这一事实。@AgostinoX我认为你是对的:我认为大多数安装都具有启动应用程序的用户的所有特权。但是,我从来没有被部署到“锁定”的环境中,所以我不确定。“不传递文件或URL,而是尽可能使用流”这是一个非常有趣的架构问题,严格来说不是“api规范”。我对这个主题非常感兴趣,也许我会在“程序员”上发布一些东西。我的想法是,有一些类可以管理“活动对象”,例如ConfigurationLoader、XmlConfigReader等等。将流而不是引用传递给它们会强制执行单一的RexResponsibility原则!它们只是管理文件的内容,而不是访问文件的方式(磁盘或web),也不是“缓存”或锁定问题。但也有管理引用的类:我有一个根目录,它依次包含配置文件、包含应用程序资源的子目录。其思想是:将这些“引用”分组,并将它们与管理“活动”对象的类分开。在这样做的时候,我遇到了URL,它是一种“更通用”的功能,或者更通用的表示某事物位置的功能。一个有趣的事实是