代码之家  ›  专栏  ›  技术社区  ›  Bern Kass

使用getResourceAsStream()从Java中的另一个包读取文件

  •  0
  • Bern Kass  · 技术社区  · 2 年前

    我试图读取一个名为“numbers.txt”的文件,该文件中填充了整数(每行一个整数,没有空行)。我想把数字放入一个数组,然后返回这个数组(方法) readIntsFromFile )。由于找不到该文件,因此 InputStream cls 返回null。如果我把文件“numbers.txt”和类放在同一个文件夹中 ReadFileInput 它可以工作,但我不知道如果我把“numbers.txt”文件放进resources文件夹,为什么它不工作。我想 getResourceAsStream() 你能拿到吗?main只是创建一个新的class对象,并使用参数“numbers.txt”调用class函数,并将结果保存在数组中。

    下面是使用该方法的类 readIntsFromFile :

    package impl;
    
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    
    public class ReadFileInput {
    
        public int[] readIntsFromFile(String path) {
            ArrayList<Integer> arrList = new ArrayList<>();
    
            try {
                InputStream cls = ReadFileInput.class.getResourceAsStream(path);
                System.out.println("Get Resources as Stream: " + cls);
             
                //Put cls in ArrayList
            
                }
                cls.close();
            } catch (Exception e) {
                System.out.println(e);
            }
    
            int[] arr = arrList.stream().mapToInt(Integer::intValue).toArray();
            System.out.println(arr);
            return arr;
        }
    }
    

    你知道它是怎么工作的吗?

    祝你一切顺利!

    1 回复  |  直到 2 年前
        1
  •  2
  •   rzwitserloot    2 年前

    传递给的字符串值 SomeClass.class.getResource() (以及 getResourceAsStream 当然)有两种“模式”。

    1. 它看起来是“相对于”包装的 SomeClass ,这意味着,如果你要求。 "img/load.png" 某个阶级 在包裹里 com.foo ,你真的在要求 "/com/foo/img/load.png" -这是 相对模式 .

    2. 您想要进入绝对模式:您想要提供 SomeClass.class JVM用来加载某个类的代码的文件,然后在同一个位置查找, /img/load.png 从那里开始。换句话说,如果 某个阶级 的代码是通过从jar文件条目加载字节码获得的 /com/foo/SomeClass.class 归档 myapp.jar ,您希望通过加载jar文件条目获得数据 /img/load。巴布亚新几内亚 来自jarfile 我的应用。罐子 .你可以这么做-只需从斜线开始。

    考虑到你的数字。txt文件似乎位于 resources ,这将强烈建议您传递给 .getResourceAsStream() 应该是 "/numbers.txt" .注意前面的斜杠。

    NB:不是 相当地 一条小路。 .. 这样做是行不通的。奇怪的是, com.foo.numbers.txt 如果jar文件包含 /com/foo/numbers.txt .