提问者:小点点

java.io.IOException:尝试从 JAR 访问 XML 文件时流关闭 [closed]


这个问题是由一个打字错误或一个无法重现的问题引起的。虽然类似的问题可能是这里的主题,但这个问题的解决方式不太可能对未来的读者有所帮助。

我试图将一个XML文件引用到我的项目中,这样我就可以解析其中的数据。

它被导出为.jar文件,这意味着我不能使用引用它

 BufferedInputStream in = new BufferedInputStream(new FileInputStream("PhillPlugin.xml"));

当我从JDeveloper IDE运行它时,它非常有效

因此,我将上面的行替换为以下行:

BufferedInputStream in = new BufferedInputStream(Class1.class.getResourceAsStream("Resources/PhillPlugin.xml"));

但是当我执行<code>.jar</code>文件时

终端中的java-jar test. jar

java.io.IOException:正在触发流关闭

必须使用Streams而不是任何解析XML库来完成它

这是我的文件所在的位置:

我就是这样读的:

基于本文

如果你想试试,下面是代码:


    public static void main(String[] args) throws  Exception {

     /*This is line 21*/   BufferedInputStream in = new BufferedInputStream(Class1.class.getResourceAsStream("Resources/PhillPlugin.xml"));


        StringBuilder sb = new StringBuilder();
        String genurl=null;
        int cp;
        while ((cp = in.read()) != -1) {
            sb.append((char) cp);
            String t = sb.toString();
            if(t.contains("</AttributeValuePair>"))
            {
                String test = sb.toString();
                String test1p[]=test.split("<value>|</value>");
                genurl=test1p[1];
                break;
            }
        }
        System.out.println(genurl);
        sb=new StringBuilder();
        while ((cp = in.read()) != -1) {

            sb.append((char) cp);
            String t = sb.toString();
            if(t.contains("</AttributeValuePair>"))
            {
                String test = sb.toString();
                String test1p[]=test.split("<value>|</value>");
                genurl=test1p[1];
                System.out.println(genurl);
                break;
            }

        }
        in.close();
    }

这是我从终端正确引用路径后获得的堆栈跟踪

Exception in thread "main" java.io.FileNotFoundException: PhillPlugin.xml (No such file or directory)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at java.io.FileInputStream.<init>(FileInputStream.java:93)
    at client.Class1.main(Class1.java:21)


共2个答案

匿名用户

假设JAR文件是以正常方式从项目创建的,该XML文件的正确资源路径将是"/PhillPlugin. xml"而不是"Resource/PhillPlugin.xml"

假设<code>Class1.class</code>在默认包中,并且您使用<code>class::getResourceAsStream</code〕,相对路径<code>“PhillPlugin.xml”</code<也应该可以工作。

使用<code>jar tvf your.jar</code>检查XML文件是否在jar中,以及XML文件的资源路径实际是什么。

匿名用户

(代表问题作者发布;从他们在问题中放置的解决方案中复制)。

更改后我忘记重新部署he. JAR文件了。它现在工作得很好。