0

我对 Java 中的路径(使用 Eclipse)有点困惑。这是我的文件结构:

 Folder

    Subfolder

        file.txt

    jarfile.jar

所以,我试图让 jar 文件解析 file.txt 中的数据,我使用以下代码:

Scanner in = new Scanner(this.getClass().getResourceAsStream("./Subfolder/file.txt"));

我用 Eclipse 制作了一个可运行的 jar 文件,放在文件夹中,但它不起作用。我做错了什么?

4

4 回答 4

2

由于您通过Class对象使用资源文件,因此资源的路径必须是绝对的:

getClass().getResourceAsStream("/Subfolder/file.txt");

请注意,做你所做的事情是一个坏主意,也就是说,在你没有参考的资源上打开扫描仪:

new Scanner(someInputStreamHere());

您没有对该输入流的引用,因此您无法关闭它。

更重要的是,如果资源不存在则.getResource*()返回;null在这种情况下,您将获得 NPE!

如果您使用 Java 6(使用 Guava 的 Closer),建议您:

final URL url = getClass().getResource("/path/to/resource");

if (url == null) // Oops... Resource does not exist
    barf();

final Closer closer = Closer.create();
final InputStream in;
final Scanner scanner;

try {
    in = closer.register(url.openStream());
    scanner = closer.register(new Scanner(in));
    // do stuff
} catch (IOException e) {
    throw closer.rethrow(e);
} finally {
    closer.close();
}

如果您使用 Java 7,只需使用 try-with-resources 语句:

final URL url = getClass().getResource("/path/to/resource");

if (url == null) // Oops... Resource does not exist
    barf();

final InputStream in;
final Scanner scanner;

try (
    in = url.openStream();
    scanner = new Scanner(in);
) {
    // do stuff
} catch (IOException e) {
    // deal with the exception if needed; or just declare it at the method level
}
于 2013-06-30T16:57:02.080 回答
1

举个例子,因为 java 是独立于平台的,请查看根据需要获取相对绝对路径或规范路径,我希望这能让您了解该做什么。

/**
 * This method reads the AcronymList.xlsx and is responsible for storing historical acronyms
 * and definitions.
 * @throws FileNotFoundException
 * @throws IOException
 * @throws InvalidFormatException 
 */
public file readAcronymList() throws FileNotFoundException, IOException, InvalidFormatException {
    String accListFile = new File("src\\org\\alatecinc\\acronymfinder\\dal\\acIgnoreAddList\\AcronymList.xlsx").getCanonicalPath();
    File acFile = new File(accListFile).getAbsoluteFile();
    return acFile;
}
于 2013-06-30T16:50:52.933 回答
0

使用以下代码。

Scanner in = new Scanner(getClass().getResource("Subfolder/file.txt"));

于 2013-06-30T16:46:01.100 回答
0

为什么是资源?txt文件是否嵌入到jar文件中?它将从 jar 中加载文件。

只需将 File 或 FileInputStream 与您已经放置的路径一起使用。

于 2013-06-30T16:46:12.707 回答