java getResourceAsStream:InputStream为空

时间:2014-12-04 18:01:19

标签: java eclipse resources classpath executable-jar

在将应用程序导出为可运行的jar后,我遇到了加载资源的问题。

方案如下:

我有一个位于类路径中的资源文件夹。在资源文件夹内有另一个文件夹,其中包含几个代表数据库查询的文件。我的第一个获取目录的解决方案如下:

URI queryResource = this.getClass().getResource("/queries/").toURI();
File queryDir = new File(queryResource);

当我在eclipse中测试代码时,这工作正常。一旦我将应用程序导出到一个可运行的char中,我就得到NullPointerExceptions。对该问题的研究产生了一种使用getResourceAsStream而不是getResource方法的解决方案。

我首先在一些用于配置目的的XML文件上对此进行了测试。所以我用过:

InputStream in = this.getClass().getResourceAsStream(/config/xml/configFile.xml);
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(in, this);

此解决方案适用于eclipse和导出的jar中的配置文件。为了加载查询文件,我写了一个小实用工具方法来使用InputStream创建一个临时目录,我将查询文件复制到其中。该方法如下所示:

public static URI createDirectory(Class<?> resourceClass, String directory) throws IOException {

    //create temp dir to store the files
    File tempDir = FileUtility.createTempDir();

    InputStream in = resourceClass.getResourceAsStream(directory));
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));

    String readLine = null;

    while((readLine = reader.readLine()) != null) {

         InputStream inputFileStream = resourceClass.getResourceAsStream(resource + readLine);
         File tempFile = new File(tempDir.getAbsolutePath() + "\\" + readLine);
         tempFile.createNewFile();
         tempFile.deleteOnExit();

         FileOutputStream fos = new FileOutputStream(tempFile);
         IOUtils.copy(inputFileStream, fos);
    }

    return tempDir.toUri();
}

现在我从那里使用我的常规代码来读取文件:

URI queryResource = createDirectory(this.getClass, "/queries/");
queryDir = new File(queryResource);

在eclipse中运行应用程序时再次正常工作。但是,在导出的jar中,InputStream方法中的第一个createDirectory为空。该流不是null它已实例化但没有内容。

有没有人知道出了什么问题?请告诉我。

问候

PS:目前使用IDE的机器无法访问网络,所以我手动输入了这个。可能会有一些错误。我写的代码没有任何语法错误。如果你在这篇文章的代码中找到任何内容,那么他​​们就是我的错误。

0 个答案:

没有答案