【问题标题】:locating file in a classpath在类路径中定位文件
【发布时间】:2010-04-19 11:13:42
【问题描述】:

我正在尝试读取文件内容,例如:

public void myMethod(){
     FileInputStream fstream = new FileInputStream(fileLocation);
     BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
     String strLine;
     while ((strLine = br.readLine()) != null) {
....
....
.....
end while 
end method

我在课程开始时有private String fileLocation;,在课程结束时我有一个getter 和setter。现在我正在尝试从这个类的 bean 中的 spring 注入这个文件位置,并指定这个类的 init-method。但是我得到错误找不到指定的文件,好像它不在类路径上但它在war文件中?我正在使用 maven 构建项目并将文件放入 src/main/resources 这是我尝试读取文件时遇到的错误:

错误:src\main\resources\ids.txt (系统找不到路径 指定)

那是我尝试这个的时候:

FileInputStream fstream = new FileInputStream("src\\main\\resources\\ids.txt");

如何从类路径中正确引用?

编辑

当我根据@BalusC 解决方案编辑我的代码时,它是这样的,但我仍然收到null 错误:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
   InputStream input = classLoader.getResourceAsStream("src/main/resources/ids.txt");
   BufferedReader br = new BufferedReader(new InputStreamReader(input));
   String strLine;
 while ((strLine = br.readLine()) != null) {
    ....
    ....
    .....
    end while 
    end method

【问题讨论】:

    标签: java


    【解决方案1】:

    Java IO API 依赖于本地磁盘文件系统,而不是类路径。此外,在 Java IO 中使用相对路径会导致可移植性问题,不要依赖它。要在类路径中分配资源,您通常会使用 ClassLoader#getResource()ClassLoader#getResourceAsStream()

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    InputStream input = classLoader.getResourceAsStream("src/main/resources/ids.txt");
    

    也就是说,您不需要 DataInputStream 行。你实际上并没有从中受益。

    更新:如果这不起作用,则要么资源名称无效,要么文件实际上不在您期望的类路径中。 src 文件夹实际上是类路径的 root 而不是包的一部分,这让我感到很沮丧。从名称中删除它。

    更新 2:获取运行时类路径覆盖的所有根磁盘文件系统路径:

    for (URL root : Collections.list(Thread.currentThread().getContextClassLoader().getResources(""))) {
        System.out.println(root);
    }
    

    资源名称需要与其中任何一个相关。在构建期间它被放置在/WEB-INF/classes 是正常的。它被类路径覆盖。你的问题出在其他地方。您确定资源名称正确吗?您确定您正在运行您认为正在运行的代码吗?

    【讨论】:

    • @BalusC 相同,当我删除 src 位时我得到空值,我刚刚查看了部署在 jboss 上的目标战争,该文件位于 WEB-INF/classes 内部但在我的项目中在 Eclipse 中,它位于 src/main/resources 任何其他技巧?
    • @BalusC 我也许可以看到这个类加载器进入了哪个文件夹或..
    • @BalusC 这是个好消息,我发现使用 for 循环需要做什么。我只需要输入ids.txt 就足够了。谢谢一百万
    猜你喜欢
    • 2015-08-11
    • 2012-04-21
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2019-04-29
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多