如何从Java中的包中访问不在包中的文件

时间:2012-12-30 00:14:31

标签: java package

我尝试搜索如何从Java中的包中访问不在指定包内的文件,但无法找到答案。有谁知道怎么做?

3 个答案:

答案 0 :(得分:1)

如果您要从命名包中访问默认(未命名)包中的CLASS,则不能。 JLS说:

  

“未命名包中的类型(第7.4.2节)没有规范名称,因此在每种导入声明中对规范名称的要求意味着(a)无法导入未命名包中的类型,(b)无法导入未命名包中的类型的静态成员。因此,§7.5.1,§7.5.2,§7.5.3和§7.5.4都要求在任何尝试时出现编译时错误在未命名的包中导入类型(或其静态成员)。“

这意味着您无法使用单一类型导入。并且“通配符”导入将无效,因为您无法命名该包。

是的,您可以通过使用反射解决此限制,但它非常麻烦,并且会使您的代码变得缓慢而脆弱。如果您想了解Java中的反射,请从这里开始 - http://docs.oracle.com/javase/tutorial/reflect/index.html。但这不是解决这个“问题”的好方法。

正确的解决方案是使用包...作为Java语言设计者的意图。 JLS说:

  

“Java SE平台提供了未命名的软件包,主要是为了方便开发小型或临时应用程序或刚开始开发时。”

这意味着你应该使用/一个未命名的软件包用于小型/临时应用程序(或作为止损),并转而使用命名软件包来处理任何严重的问题。


如果您想要访问未命名包中的FILE(例如资源),那么您只需要在资源名称的前面加上斜杠; e.g。

      InputStream is = classLoader.getResourceAsStream("/someresource");

答案 1 :(得分:0)

你不能没有反思。

真的不鼓励使用'默认包'(根本没有包),这是阻止它的一种方法。

答案 2 :(得分:0)

“default”包实际上是根目录。使用绝对路径:

URL url = getClass().getResource("/myphoto.jpg");
InputStream in = getClass().getResourceAsStream("/myphoto.jpg");

用7zip / WinZip等打开创建的jar。您应该在根目录中看到该文件。