我在运行 .jar 时收到这些文件未找到的异常,但在 netbeans 中运行我的应用程序时却没有。以下是错误消息,当前目录打印在顶部。
adam@Adam ~/Dropbox/linuxWorkspace/Netbeans/EveMarketCalculater/dist $ java -jar "EveMarketCalcuter.jar"
当前系统目录:/home/adam/Dropbox/linuxWorkspace/Netbeans/EveMarketCalculater/dist
java.io.FileNotFoundException: file:/home/adam/Dropbox/linuxWorkspace/Netbeans/EveMarketCalculater/dist/EveMarketCalculater.jar!/inputOutput/TypeID.csv(没有这样的文件或目录) 在 java.io.FileInputStream.open0( native 方法) 在 java.io.FileInputStream.open(FileInputStream.java:195) 在 java.io.FileInputStream.(FileInputStream.java:138) 在 java.io.FileInputStream.(FileInputStream.java:93) 在 java.io.FileReader.(FileReader.java:58) 在 inputOutput.csvParser.readFile(csvParser.java:54) 在 inputOutput.csvParser.(csvParser.java:24) 在 evemarketcalculater.EveMarketCalculater.main(EveMarketCalculater.java:39)
java.io.FileNotFoundException: file:/home/adam/Dropbox/linuxWorkspace/Netbeans/EveMarketCalculater/dist/EveMarketCalculater.jar!/inputOutput/Regions.csv(没有这样的文件或目录) 在 java.io.FileInputStream.open0( native 方法) 在 java.io.FileInputStream.open(FileInputStream.java:195) 在 java.io.FileInputStream.(FileInputStream.java:138) 在 java.io.FileInputStream.(FileInputStream.java:93) 在 java.io.FileReader.(FileReader.java:58) 在 inputOutput.csvParser.readFile(csvParser.java:54) 在 inputOutput.csvParser.(csvParser.java:24) 在 evemarketcalculater.EveMarketCalcuter.main(EveMarketCalculater.java:42)
java.io.FileNotFoundException: file:/home/adam/Dropbox/linuxWorkspace/Netbeans/EveMarketCalculater/dist/EveMarketCalculater.jar!/inputOutput/SolarSystems.csv(没有这样的文件或目录) 在 java.io.FileInputStream.open0( native 方法) 在 java.io.FileInputStream.open(FileInputStream.java:195) 在 java.io.FileInputStream.(FileInputStream.java:138) 在 java.io.FileInputStream.(FileInputStream.java:93) 在 java.io.FileReader.(FileReader.java:58) 在 inputOutput.csvParser.readFile(csvParser.java:54) 在 inputOutput.csvParser.(csvParser.java:24) 在 evemarketcalculater.EveMarketCalculater.main(EveMarketCalculater.java:45)
java.io.FileNotFoundException: file:/home/adam/Dropbox/linuxWorkspace/Netbeans/EveMarketCalculater/dist/EveMarketCalculater.jar!/inputOutput/MyOrders.csv(没有这样的文件或目录) 在 java.io.FileInputStream.open0( native 方法) 在 java.io.FileInputStream.open(FileInputStream.java:195) 在 java.io.FileInputStream.(FileInputStream.java:138) 在 java.io.FileInputStream.(FileInputStream.java:93) 在 java.io.FileReader.(FileReader.java:58) 在 inputOutput.csvParser.readFile(csvParser.java:96) 在 inputOutput.csvParser.(csvParser.java:29) 在 evemarketcalculater.EveMarketCalculater.main(EveMarketCalculater.java:48)
这是我如何访问这些文件的一些源代码:
public final void readFile(String file, int index1, int index2)
{
BufferedReader br = null;
String line = "";
String cvsSplit = ",";
idList = new ArrayList();
try
{
URL url = csvParser.class.getResource(file);
br = new BufferedReader(new FileReader(url.getPath()));
while((line = br.readLine()) != null)
{
String[] item = line.split(cvsSplit);
idList.add(item[index1].replace("\"",""));
idList.add(item[index2].replace("\"",""));
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
if(br != null)
{
try
{
br.close();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
public static void writeMyOrders()
{
URL url = csvParser.class.getResource("MyOrders.csv");
FileWriter w = null;
csvWriter c = null;
try
{
// Empty file cotents
PrintWriter writer = new PrintWriter(url.getPath());
writer.close();
w = new FileWriter(url.getPath());
c = new csvWriter();
}
catch(Exception ex)
{
ex.printStackTrace();
}
for(int i = 0; i < myOrders.size(); i++)
{
try
{
c.writeLine(w, myOrders.get(i));
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
if(w != null)
try
{
w.close();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
知道为什么这不起作用吗?它显然是在跟踪正确的文件路径,并且这些文件存在于 .jar 文件中的这些路径中。如果重要的话,我会在 Linux 命令行中运行。
这是文件存在的证据。
最佳答案
在创建 BufferedReader
时尝试使用以下语句:
br = new BufferedReader(new InputStreamReader(csvParser.class.getResourceAsStream(file)));
Class.getResource()
返回 URL
而 Class.getResourceAsStream()
给你 InputStream
来自您可以在其中直接读取文件内容。
解释
从错误消息中可以看出,您的应用程序无法找到文件 file:/home/adam/Dropbox/linuxWorkspace/Netbeans/EveMarketCalculater/dist/EveMarketCalculater.jar!/inputOutput/TypeID.csv
。要验证这一点,您可以尝试使用任何其他应用程序打开上述文件,例如 gedit
或 chrome
或 vi
。如果您可以打开它,您的应用程序也可以打开它。
您从 getResource()
返回的 URL
中获得了这样的路径。当它是 getResourceAsStream()
时,您会得到一个包含您要查找的资源的 InputStream
。
您可以选择更新 jar 文件中的文件。自己没试过,可以引用Can a Jar File be updated programmatically without rewriting the whole file?
关于Java .jar 文件在存在时找不到系统文件并且遵循正确的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38929867/