【问题标题】:Java Swing Gui is not able to read data from the file inside the runnable jarJava Swing Gui 无法从可运行 jar 内的文件中读取数据
【发布时间】:2020-11-01 22:02:45
【问题描述】:

好的,所以我遇到了一个问题,一旦我将我的 Java Swing 项目导出到一个可运行的 jar 文件中,我编写的功能的一部分就根本不起作用。即读取文件“TryndaUpdate101720.tsv”。当我在 IDE eclipse 中测试它时它工作正常,但是一旦它被导出它就不能像在测试环境中那样运行。

我已经查找了这个问题,但找不到任何解决方案。还有另一种方法可以使它读取“TryndaUpdate101720.tsv”,但它对用户不友好,因为我必须在可运行的 jar 文件之外包含“TryndaUpdate101720.tsv”,并且必须从用户那里获取输入以获取它的路径。我真的不想这样做。

读取文件代码的实现:

allRows = parser.parseAll(new FileReader(this.getClass().getResource("/sim/resources/TryndaUpdate101720.tsv").getPath()));

这是我在运行导出的可运行 jar 文件时遇到的错误。我已将错误加粗以表明这是代码中断的文件路径。我的猜测是因为“!”在文件路径中。

java.io.FileNotFoundException: **file:\C:\Users\ssimr\Downloads\TryndaMatchUpGui.jar!\sim\resources\TryndaUpdate101720.tsv (The filename, directory name, or volume label syntax is incorrect)**
    at java.base/java.io.FileInputStream.open0(Native Method)
    at java.base/java.io.FileInputStream.open(FileInputStream.java:211)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:153)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:108)
    at java.base/java.io.FileReader.<init>(FileReader.java:60)
    **at sim.gui.WhichChamp.getChampFromTSV(WhichChamp.java:217)**
    at sim.gui.Expertimentgui$4.mouseClicked(Expertimentgui.java:368)
    at java.desktop/java.awt.Component.processMouseEvent(Component.java:6617)
    at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
    at java.desktop/java.awt.Component.processEvent(Component.java:6379)
    at java.desktop/java.awt.Container.processEvent(Container.java:2263)
    at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4990)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4822)
    at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4919)
    at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4557)
    at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4489)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
    at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2769)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4822)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)

【问题讨论】:

    标签: java swing oop user-interface jar


    【解决方案1】:

    您需要以 Stream 的形式获取资源,以便从您的 JAR 中读取文件。这是一个将文本文件作为流读取的示例。另外,请确保您的文件路径正确,因为这可能是个问题。

    //static URL url = ClassName.class.getClassLoader().getResource("/sim/resources/TryndaUpdate101720.tsv");
    //InputStreamReader file = new InputStreamReader(url.openStream());
    static InputStream in = ClassName.class.getResourceAsStream("/sim/resources/TryndaUpdate101720.tsv");
    
    public static void readTxtFile(String content) {
            BufferedReader br;
            try {
                //FileReader file = new FileReader(filename);
                //InputStreamReader file = new InputStreamReader(url.openStream());
                //System.out.println(file.getAbsolutePath());
                in = Thread.currentThread().getContextClassLoader().getResourceAsStream("TryndaUpdate101720.tsv");
                br = new BufferedReader(new InputStreamReader(in));
                
                String line = br.readLine();
                int i = 0;
                while(line != null) {
                    if(line.equals(content)) {
                        System.out.println("Expected input equals actual text!");
                        break;
                    }
                    line = br.readLine();
                    i++;
                }
                
                br.close();
            } catch (Exception e) {
                //System.out.println("Exception occurred in readTxtFile.");
                e.printStackTrace();
            }
    }
    

    另见this

    【讨论】:

    • @Simran 很高兴它有帮助。正如 MadProgrammer 所说,不要忘记通过单击复选标记(答案旁边)“接受”答案,这样人们就知道问题已经解决了。
    【解决方案2】:

    取决于您使用的是哪种构建工具。 您要访问的文件可能未包含在 jar 中或包含但位于不同的位置。

    Eclipse 和一些 IDE 将从项目位置运行应用程序,因此它可以毫无问题地运行。

    检查您的工具、ant、maven、gradle 等文档,了解如何在 jar 中包含资源。

    【讨论】:

      【解决方案3】:

      感谢@Pranav Amarnath,我能够解决我的问题。因此,我没有使用 FileReader,而是使用 BufferedReadergetResourceAsStream 来获取 jar 文件中的文件。

      之前:

      allRows = parser.parseAll(new FileReader(this.getClass().getResource("/sim/resources/TryndaUpdate101720.tsv").getPath()));
      

      之后:

      InputStream in = getClass().getResourceAsStream("/sim/resources/TryndaUpdate101720.tsv"); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(in));
      allRows = parser.parseAll(reader);
      

      【讨论】:

      • 那么您应该投票并将 Pranav Amarnath 的答案标记为“已接受”
      • 你是对的。我想我必须在 parseAll 中创建一个新的 BufferedReader 实例。
      猜你喜欢
      • 2014-01-15
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 2011-02-25
      • 2013-02-20
      • 2020-11-22
      • 2014-11-10
      • 1970-01-01
      相关资源
      最近更新 更多