【问题标题】:Java problems with accessing resource files when application is used as library将应用程序用作库时访问资源文件的 Java 问题
【发布时间】:2015-10-07 00:58:02
【问题描述】:

我有两个 Java 应用程序。一个应用程序将包含资源文件,并将用作其他 Java 应用程序的库。

第一个应用程序 com.test.resourceusing.MainClass.java 包含 res/base.xml 资源文件。

package com.test.resourceusing;

import java.io.BufferedInputStream;
import java.io.File;

import java.net.MalformedURLException;
import java.net.URL;

import java.util.Scanner;

public class MainClass {
public MainClass() {
    super();
}

public static void main(String[] args) {
    MainClass main = new MainClass();
    try {
        main.start();
    } catch (MalformedURLException e) {
    }
}

public void start() throws MalformedURLException {
    URL url = getClass().getResource("res/base.xml");
    System.out.println(url.getPath());
    System.out.println(url.getFile());
    File f = new File(url.getFile());
    if (f.exists()) {
        System.out.println("File exist!");

        BufferedInputStream result = (BufferedInputStream) 
              getClass().getResourceAsStream("res/base.xml");
        Scanner scn = new Scanner(result);
        while(scn.hasNext()){
            System.out.println(scn.next());
        }
    } else {
        System.out.println("Not working! :(");    
    }
}

}

结果是:

/C:/Work/Projects/ResourceUsing/classes/com/test/resourceusing/res/base.xml
/C:/Work/Projects/ResourceUsing/classes/com/test/resourceusing/res/base.xml
File exist!
<?xml
version='1.0'
encoding='utf-8'?>
<schema>
</schema>

然后我创建包含所有资源文件的 .jar 文件并尝试将其用作其他应用程序中的库。

第二个应用: 资源测试.MainClassTest.java

package resourcetest;

import com.test.resourceusing.MainClass;

import java.net.MalformedURLException;

public class MainClassTest {
  public MainClassTest() {
    super();
  }

  public static void main(String[] args) {
    MainClass main = new MainClass();
    try {
        main.start();
    } catch (MalformedURLException e) {
    }
  }
}

结果是:

file:/C:/Work/Projects/ResourceUsing/deploy/archive1.jar!/com/test/resourceusing/res/base.xml
file:/C:/Work/Projects/ResourceUsing/deploy/archive1.jar!/com/test/resourceusing/res/base.xml
Not working! :(

我不明白为什么它不起作用,我的代码有问题吗?或者这个解决方案在 Java 中是不可能的?

【问题讨论】:

    标签: java resources


    【解决方案1】:

    你看到这些文件的位置有什么不同吗?

    /C:/Work/Projects/ResourceUsing/classes/com/test/resourceusing/res/base.xml
    file:/C:/Work/Projects/ResourceUsing/deploy/archive1.jar!/com/test/resourceusing/res/base.xml
    

    您无法使用File API 访问位于 JAR 文件中的资源。

    您的代码已经在路上了。一个简单的编辑应该可以工作:

    public void start() throws IOException {
        URL url = getClass().getResource("res/base.xml");
        if (url != null) {
            System.out.println(url.getPath());
            System.out.println(url.getFile());
            System.out.println("File exist!");
    
            try(InputStream result = url.openStream()) {
                try(Scanner scn = new Scanner(result)) {
                    while(scn.hasNext()) {
                        System.out.println(scn.next());
                    }
                }
            }
        } else {
            System.out.println("Not working! :(");    
        }
    }
    

    【讨论】:

      【解决方案2】:

      经过更深入的搜索,我似乎找到了一个原因 - https://stackoverflow.com/a/10605316/1117515。 在这种情况下,我需要使用 getResourceAsStream()。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-30
        • 1970-01-01
        • 2019-03-18
        相关资源
        最近更新 更多