繁体   English   中英

Java Swing Gui 无法从可运行的 jar 文件中读取数据

[英]Java Swing Gui is not able to read data from the file inside the runnable jar

好的,所以我遇到了一个问题,一旦我将我的 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)

您需要将资源作为 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();
        }
}

另见这个

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

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

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

感谢@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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM