尝试了解java-land中的资源。我相信以下情况属实:
因此,资源必须始终具有唯一的文件名,否则将发生冲突。
我的假设或结论是否存在缺陷?
答案 0 :(得分:2)
假设1)通过类路径加载的资源没有命名空间,它们只有文件名。
从类路径加载的资源实际上由路径名而不是简单文件名标识。您可以将路径名的目录部分视为形成名称空间。
此外,如果使用Class.getResourceAsStream(String pathname)
加载,则不以“/”开头的路径名将被解释为相对于类包的路径名。
类路径机制通过在类路径上覆盖每个JAR文件的名称空间等来工作。因此,您可以在具有相同路径名的不同JAR中拥有多个资源,但实际上只能看到一个。 (您稍后将其描述为“碰撞”。)但是从可见的路径名集的角度来看,每个路径名都唯一地标识资源。
假设2)最明智的做法是始终通过类路径加载资源,永远不要通过文件系统加载资源,即使在单元测试中也是如此。
如果我们讨论应用程序的资源,那么从类路径加载具有明显的优势。但是,如果我们讨论的是由应用程序创建和管理的资源,那么通过类路径加载会出现问题...因为您无法将资源写入类路径。
此外,即使澄清了“资源”的含义,我也不认为通过类路径加载资源始终最明智是正确的。我们不可能预期所有场景/用例,因此不能说可能没有某些场景/用例,最明智的方法是加载资源一些另一种方式。 (但是,如果你说“一般”或“通常”而不是“总是”,我会同意这个假设。)
结论3)因此,资源必须始终具有唯一的文件名,否则将发生冲突。
如果来自类路径上不同JAR的资源具有非唯一路径名,那么您确实会遇到一种冲突,并且一个或另一个资源将无法加载(至少不能通过普通的类加载器API)。但是这个可能正是你想要发生的事情!
我的假设或结论是否存在缺陷?
假设1)表面上是错误的,但它可以以一种真实的方式重新解释。
结论3)逻辑上遵循重新解释的假设1)。
假设2)也是错误的,但可以以使其成立的方式重新解释:即“永远”放松,并用“资源”定义你的意思。但是,这个假设在逻辑上并不需要得出结论。
答案 1 :(得分:0)
不,除了对于所有意图和目的而言,具有相关点符号和文件结构的包充当命名空间。
我个人认为加载资源对于单元测试特别有用,因为通过使用类路径,我可以确保通过测试版本隐藏生产资源。
在实践中,我发现当使用基于包的一致命名方案时,我很少发生冲突。它有点冗长,但我们已经习惯了Javaland。