Java .jar 文件在存在时找不到系统文件并且遵循正确的路径

标签 java linux netbeans jar

我在运行 .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 命令行中运行。

这是文件存在的证据。

picture of .jar directory

最佳答案

在创建 BufferedReader 时尝试使用以下语句:

br = new BufferedReader(new InputStreamReader(csvParser.class.getResourceAsStream(file)));

Class.getResource() 返回 URLClass.getResourceAsStream() 给你 InputStream 来自您可以在其中直接读取文件内容。

解释 从错误消息中可以看出,您的应用程序无法找到文件 file:/home/adam/Dropbox/linuxWorkspace/Netbeans/EveMarketCalculater/dist/EveMarketCalculater.jar!/inputOutput/TypeID.csv。要验证这一点,您可以尝试使用任何其他应用程序打开上述文件,例如 geditchromevi。如果您可以打开它,您的应用程序也可以打开它。

您从 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/

相关文章:

java - FileBackedOutputStream 用例( Guava )

fopen可以用来打开url吗

linux - 如何配置构建与加载内核模块相同的内核模块

linux - TIZEN SDB Shell - 输入点击或触摸屏命令

java - NetBeans 无法安装某些模块

java - 实体图上的 JPA 更改事件 [EclipseLink]

java - TLS 版本字符串是否有任何官方标准?

java - 为什么 Java VM 更新 25 会因内部错误而崩溃

java - Netbeans:如何构建附加了外部 .jar 库的 .jar 文件?

在事件 JDK 中找不到 JavaFX 部署库