Java 当我的类和文本文件位于可执行JAR中时,如何编写代码来访问文本文件?

Java 当我的类和文本文件位于可执行JAR中时,如何编写代码来访问文本文件?,java,deployment,executable-jar,Java,Deployment,Executable Jar,我知道这个问题以前被问过很多次,但答案似乎对我没有帮助。以下是我的具体问题: 我有一个类“TaQL”,它从void main(String args[])方法中访问两个文本文件。这两个文本文件与这个类位于同一个包中:包“taql”。以下代码在Eclipse(Mars)IDE中运行良好: 当我输出这两个字符串时,我得到了到资源的正确路径,代码也随之而生 但是,当我将所有内容打包到一个JAR中后使用此方法时,两个字符串都返回“null” 下面是我的代码在非JAR版本中对每个文本文件所做的操作 获取每

我知道这个问题以前被问过很多次,但答案似乎对我没有帮助。以下是我的具体问题:

我有一个类“TaQL”,它从void main(String args[])方法中访问两个文本文件。这两个文本文件与这个类位于同一个包中:包“taql”。以下代码在Eclipse(Mars)IDE中运行良好:

当我输出这两个字符串时,我得到了到资源的正确路径,代码也随之而生

但是,当我将所有内容打包到一个JAR中后使用此方法时,两个字符串都返回“null”

下面是我的代码在非JAR版本中对每个文本文件所做的操作

  • 获取每个文本文件的文件名字符串
  • 从一个字符串创建新的文件对象,从另一个字符串创建新的FileReader对象
  • 它们分别被输入到停止列表函数和数据输入迭代器中
  • 我真正需要做的是,一旦这两个文本文件都放在一个JAR中,就可以无缝地访问它们,然后使用对它们的一些引用来创建一个File和FileReader对象

    这是我在主方法中输入的一些诊断代码。它将显示JAR文件所看到的文件(注意,输入和停止列表都是文件名字符串):

    运行JAR版本的程序的命令行输出(请注意,当我从Eclipse运行时,此代码工作得非常好)


    要实际访问jar文件中可能存在的那些文件的字节,您需要使用类#getResourceAsStream(stopList)。URI将为您提供无法与File或FileInputStream一起使用的路径。它在您的IDE中工作,因为IDE尚未打包文件,因此#getPath会找到实际的文件路径

    因此,请尝试以下方法:

    try (Reader inputReader = 
            new InputStreamReader(
                TaQL.class.getResourceAsStream(input))) {
    
        BufferedReader in = new BufferedReader(inputReader);
    
        for (String line; (line = in.readLine()) != null;) {
            // do something with the line
        }
    }
    

    要实际访问jar文件中可能存在的那些文件的字节,您需要使用类#getResourceAsStream(stopList)。URI将为您提供无法与File或FileInputStream一起使用的路径。它在您的IDE中工作,因为IDE尚未打包文件,因此#getPath会找到实际的文件路径

    因此,请尝试以下方法:

    try (Reader inputReader = 
            new InputStreamReader(
                TaQL.class.getResourceAsStream(input))) {
    
        BufferedReader in = new BufferedReader(inputReader);
    
        for (String line; (line = in.readLine()) != null;) {
            // do something with the line
        }
    }
    

    啊,所以一旦它在罐子里,你就必须处理流,而不是文件,对吗?对。这将安全地访问它,无论它是如何包装的。是的,这是有效的。有没有办法一次读入整个文件,或者一行一行地读入?好的@Bey,你的问题有点超出范围,但我更新了我的答案,包括如何一行一行地读入文件。谢谢..我知道我有点“贪婪”…这就是为什么我首先接受了你的答案。我讨厌人们用“…哦,还有…”的问题把别人串在一起。非常感谢!啊,所以一旦它在罐子里,你就必须处理流,而不是文件,对吗?对。这将安全地访问它,无论它是如何包装的。是的,这是有效的。有没有办法一次读入整个文件,或者一行一行地读入?好的@Bey,你的问题有点超出范围,但我更新了我的答案,包括如何一行一行地读入文件。谢谢..我知道我有点“贪婪”…这就是为什么我首先接受了你的答案。我讨厌人们用“…哦,还有…”的问题把别人串在一起。非常感谢!将其视为jar中的文本文件是不正确的,jar本身就是一个文件,因此“文本文件”只是jar归档文件的一部分。@JamesWierzba谢谢James…这是我的困惑!流式输入解决了这个问题。将其视为jar中的文本文件是不正确的,jar本身就是一个文件,所以“文本文件”只是jar存档文件的一部分。@JamesWierzba感谢James…这是我的困惑!流式输入解决了这个问题。
    try (Reader inputReader = 
            new InputStreamReader(
                TaQL.class.getResourceAsStream(input))) {
    
        BufferedReader in = new BufferedReader(inputReader);
    
        for (String line; (line = in.readLine()) != null;) {
            // do something with the line
        }
    }