代码之家  ›  专栏  ›  技术社区  ›  Dikla

GetResourceAsstream不适用于每个类?

  •  4
  • Dikla  · 技术社区  · 17 年前

    我有一个JAR文件,它使用一些TXT文件。为了得到它们,它使用 Class.getResourceAsStream 功能。

    Class A
    {
        public InputStream getInputStream(String path) throws Exception {
            try {
                return new FileInputStream(path);
            } catch (FileNotFoundException ex) {
                InputStream inputStream = getClass().getResourceAsStream(path);
                if (inputStream == null)
                    throw new Exception("Failed to get input stream for file " + path);
                return inputStream;
            }
        }
    }
    

    此代码工作正常。

    问题是,如果我把A类定义为 extends java.io.File ,我从中得到的输入流 getResourceAsStream 是空的。

    另外,如果我将类A保留为常规类(不是继承的),并将类B定义为:

    Class B extends java.io.File
    {
        public InputStream getInputStream(String path) throws Exception
        {
         return new A().getInputStream(path);
     }
    }
    

    返回的inputstream仍为空。

    有什么问题?有方法从继承的类中访问文件吗 File ?

    谢谢,

    4 回复  |  直到 15 年前
        1
  •  10
  •   Jon Skeet    17 年前

    我怀疑这更多地与包有关,而不是继承。

    如果您的类在一个包中,那么 getResourceAsStream() 将相对于该包,除非以“/”(使其成为“绝对”资源)开头。另一种选择是使用 getClass().getClassLoader().getResourceAsStream() 它不知道路径是相对于包的。

    只是子类化 File 根本不应该影响行为。如果你真的相信,请张贴一个简短但完整的程序来演示这个问题。

        2
  •  4
  •   schmmd    15 年前

    以下是一些佐证乔恩·斯基特解释的例子:

    前提:您有一个类my.package.a,这取决于foo.txt。

    1. 如果您使用my.package.a.class.getresourceasstream(“foo.txt”),并将foo.txt放在jar文件中的my/package/foo.txt,那么在运行a类时,应该找到foo.txt。

    2. 如果您使用my.package.a.class.getClassLoader().getResourceAsstream(“foo.txt”),那么将foo.txt放在类路径上的任何文件夹中,当您运行类A时,它应该会找到foo.txt。

    3. 如果您使用my.package.a.class.getresourceasstream(“/foo.txt”),并将foo.txt放在我的jar文件中的/foo.txt,那么在运行项目A时,它应该会找到foo.txt。

        3
  •  1
  •   Grmpf    17 年前

    imho它还是比较好用的 getClass().getClassLoader().getResourceAsStream() 因为如果子类(子类位于另一个pacakge中)并调用父方法,上述代码可能会失败。

        4
  •  0
  •   Dikla    17 年前

    对不起,问题不一样。(实际上没问题…)

    在继承自的类中 java.io.File 我用过 getPath() 以获取资源的路径。但是路径有反斜杠而不是常规斜杠(因为我在Windows OS上工作)。当我使用常规斜杠时,它甚至在使用继承类时也有效。