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

Java Swing Gui无法从可运行jar中的文件读取数据,java,swing,oop,user-interface,jar,Java,Swing,Oop,User Interface,Jar,好的,所以我遇到了一个问题,一旦我将我的JavaSwing项目导出到一个可运行的jar文件中,我编写的特性的一部分就完全不起作用了。这是为了读取文件“TryndaUpdate101720.tsv”。当我在IDEEclipse中测试它时,它工作得很好,但是一旦导出它,它就不能像在测试环境中那样工作了 我查过这个问题,找不到任何解决办法。还有另一种方法,我可以让它读取“TryndaUpdate101720.tsv”,但它不是用户友好的,因为我必须在可运行jar文件之外包含“TryndaUpdate1

好的,所以我遇到了一个问题,一旦我将我的JavaSwing项目导出到一个可运行的jar文件中,我编写的特性的一部分就完全不起作用了。这是为了读取文件“TryndaUpdate101720.tsv”。当我在IDEEclipse中测试它时,它工作得很好,但是一旦导出它,它就不能像在测试环境中那样工作了

我查过这个问题,找不到任何解决办法。还有另一种方法,我可以让它读取“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.io.FileNotFoundException:*文件:\C:\Users\ssimr\Downloads\TryndaMatchUpGui.jar\sim\resources\TryndaUpdate101720.tsv(文件名、目录名或卷标语法不正确)**
位于java.base/java.io.FileInputStream.open0(本机方法)
位于java.base/java.io.FileInputStream.open(FileInputStream.java:211)
位于java.base/java.io.FileInputStream。(FileInputStream.java:153)
位于java.base/java.io.FileInputStream。(FileInputStream.java:108)
位于java.base/java.io.FileReader(FileReader.java:60)
**在sim.gui.WhichChamp.getChampFromTSV(WhichChamp.java:217)**
在sim.gui.expertiongui$4.mouseClicked(expertiongui.java:368)
位于java.desktop/java.awt.Component.ProcessMouseeEvent(Component.java:6617)
位于java.desktop/javax.swing.JComponent.ProcessMouseeEvent(JComponent.java:3342)
位于java.desktop/java.awt.Component.processEvent(Component.java:6379)
位于java.desktop/java.awt.Container.processEvent(Container.java:2263)
位于java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4990)
位于java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
位于java.desktop/java.awt.Component.dispatchEvent(Component.java:4822)
位于java.desktop/java.awt.LightweightDispatcher.RetargetMouseeEvent(Container.java:4919)
位于java.desktop/java.awt.LightweightDispatcher.ProcessMouseeEvent(Container.java:4557)
位于java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4489)
位于java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
位于java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2769)
位于java.desktop/java.awt.Component.dispatchEvent(Component.java:4822)
位于java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
位于java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
位于java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
位于java.base/java.security.AccessController.doPrivileged(AccessController.java:391)

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

//静态URL URL=ClassName.class.getClassLoader().getResource(“/sim/resources/TryndaUpdate101720.tsv”);
//InputStreamReader文件=新的InputStreamReader(url.openStream());
静态InputStream in=ClassName.class.getResourceAsStream(“/sim/resources/TryndaUpdate101720.tsv”);
公共静态void readTxtFile(字符串内容){
缓冲剂;
试一试{
//FileReader文件=新的FileReader(文件名);
//InputStreamReader文件=新的InputStreamReader(url.openStream());
//System.out.println(file.getAbsolutePath());
in=Thread.currentThread().getContextClassLoader().getResourceAsStream(“TryndaUpdate101720.tsv”);
br=新的BufferedReader(新的InputStreamReader(in));
String line=br.readLine();
int i=0;
while(行!=null){
if(行等于(内容)){
System.out.println(“预期输入等于实际文本!”);
打破
}
line=br.readLine();
i++;
}
br.close();
}捕获(例外e){
//System.out.println(“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);

然后你应该投票,马克·普拉纳夫·阿马纳特回答说“接受”,你是对的。我想我必须在parseAll中创建一个新的BufferedReader实例。@Simran很高兴这有帮助。正如MadProgrammer所说,不要忘记通过点击复选标记(答案旁边)来“接受”答案,这样人们就知道问题已经解决了。