[英]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,而是使用BufferedReader和getResourceAsStream来获取 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.