可以在从Netbeans执行时读取文件,但在执行JAR文件时不能读取

时间:2014-02-27 09:04:24

标签: java netbeans jar

我有一个程序需要从XML-file获取信息,并且当我在NetBeans中执行时,它正按计划运行。另一方面,当我使用JAR文件并尝试执行相同操作时,我正在捕获IOException。这是为什么?我正在使用具有绝对路径的字符串:

InputStream in = new FileInputStream(strPath);
doc = db.parse(in);


java.io.FileNotFoundException: kmk (Det går inte att hitta filen)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:146)
    at java.io.FileInputStream.<init>(FileInputStream.java:101)
    at xmlDom.XMLTolk.skapaTolk(XMLTolk.java:82)
    at xmlDom.XMLTolk.<init>(XMLTolk.java:61)
    at xmlDom.Kloak.<init>(Kloak.java:46)
    at xmlDom.Kloak.main(Kloak.java:123)

这个小程序可以解析XML文件,但是当我创建它的JAR文件时 - 它不起作用。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class XMLTest {

        Document d;

        public XMLTest() throws ParserConfigurationException, FileNotFoundException, IOException, SAXException {

            String docString = "C:\\someXML.xml";
            DocumentBuilderFactory dbf;
            dbf = DocumentBuilderFactory.newInstance();

            dbf.setValidating(true);
            dbf.setIgnoringElementContentWhitespace(true);

            DocumentBuilder db = dbf.newDocumentBuilder();

            InputStream in = new FileInputStream(docString);

            d = db.parse(in);
        }



    public static void main(String[] args) throws ParserConfigurationException, FileNotFoundException, IOException, SAXException {

        XMLTest t = new XMLTest();
    }
}

2 个答案:

答案 0 :(得分:0)

最有可能的原因是你正在尝试读取应用程序类路径中的文件,并且当它打包在jar中时,该项目没有文件系统文件。请改用ClassLoader#getResourceAsStream

答案 1 :(得分:0)

使用“java -jar foo.jar”运行时,不会更改当前工作目录。

因此,当您使用相对路径时,它们相对于您当前工作目录的相对路径已经找到,而不是相对于您直观可能期望的jar文件位置。

对于大多数情况,您可以向JVM询问它在哪里找到用于定义给定类的字节,并使用它来获取jar文件的位置,然后可以使用它来定位kmk文件。