【问题标题】:What is the difference between getResourceAsStream with and without getClassLoader?带和不带 getClassLoader 的 getResourceAsStream 有什么区别?
【发布时间】:2012-09-06 04:19:05
【问题描述】:

我想知道以下两者的区别:

MyClass.class.getClassLoader().getResourceAsStream("path/to/my/properties");

MyClass.class.getResourceAsStream("path/to/my/properties");

谢谢。

【问题讨论】:

    标签: java classloader


    【解决方案1】:

    来自Class.getResourceAsStream() 的 Javadoc:

    这个方法委托给这个对象的类加载器。 在委托之前,使用此算法从给定的资源名称构造一个绝对资源名称:

    • 如果name 以“/”开头(“\u002f”),则资源的绝对名称是“/”后面的名称部分。
    • 否则,绝对名称的格式如下: modified_package_name/name
      其中 modified_pa​​ckage_name 是此对象的包名称,其中 '/' 替换为 '.' ('\u002e')。

    换句话说,如果“路径”以“/”开头,它们会做同样的事情,但如果不是,那么在后一种情况下,路径将相对于类的包,而类加载器将是绝对的。

    简而言之,第一个获取path/to/my/properties,第二个获取package/of/myclass/path/to/my/properties

    【讨论】:

      【解决方案2】:

      来自Class.getClassLoader()documentation

      返回类的类加载器。一些实现可能使用 null 表示引导类加载器。此方法将返回 如果此类由引导程序加载,则在此类实现中为 null 类加载器。

      所以getClassLoader()可能返回null,如果该类是由引导类加载器加载的,因此Class.getResourceAsStreamimplementation中的空检查:

      public InputStream getResourceAsStream(String name) {
          name = resolveName(name);
          ClassLoader cl = getClassLoader0();
          if (cl==null) {
              // A system class.
              return ClassLoader.getSystemResourceAsStream(name);
          }
          return cl.getResourceAsStream(name);
      }
      

      您还会注意到 Mark Peters 在 his answer 中解释的声明 name = resolveName(name);

      【讨论】:

        【解决方案3】:

        主要的实际区别是您可以在上课时使用相对路径。因此,如果您的属性与 MyClass 在同一个包中,则可以这样做

        MyClass.class.getResourceAsStream("properties");
        

        【讨论】:

          猜你喜欢
          • 2020-06-13
          • 2021-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-16
          相关资源
          最近更新 更多