【问题标题】:Java I/O help. Jar Cannot Open File: URI is Not HierarchalJava I/O 帮助。 Jar 无法打开文件:URI 不是分层的
【发布时间】:2020-08-13 00:49:09
【问题描述】:

我已经搜索了 3 天,现在不停地查看我能找到的每个帖子。我的程序在 IntelliJ 上运行,但无法在可执行文件上运行。您的帮助将不胜感激:)

更重要的是,我在哪里可以找到深入的用户友好教程?有我可以支付的课程或书籍吗?在 Udemy 上,java 类完全没有提到类路径和 URI 等 I/O。 TutorialsPoint 简要介绍了 I/O,但并不深入。我错过了什么?有没有更简单的方法来完成这一切??

对我不起作用的类似帖子: Java Jar file: use resource errors: URI is not hierarchical https://stackoverflow.com/a/27149287/155167

我正在尝试加载一个 Excel 文件。我正在使用 Maven。 Apache POI 说它需要一个文件。所以 InputStream 不起作用http://poi.apache.org/components/spreadsheet/quick-guide.html#FileInputStream

当我使用 java -jar jarFile 时,它​​给了我错误

C:\Users\1010\Documents\Personal\MonsterManager>java -jar monsterManagerVer3.jar

Exception in thread "main" java.lang.IllegalArgumentException: URI is not hierarchical

        at java.base/java.io.File.<init>(File.java:421)
        at LoadExcel.<init>(LoadExcel.java:62)
        at monsterRunner.<init>(monsterRunner.java:13)
        at monsterRunner.main(monsterRunner.java:24)

这里是代码

public LoadExcel() throws IOException, URISyntaxException, InvalidFormatException {
        mNames = null;
        URL ins = this.getClass().getResource("/excel_List.xlsx");
        if (ins == null)
            throw new FileNotFoundException("The XLSX file didn't exist on the classpath");
        ins.toString().replace(" ","%20"); //<-Runs without this part

        File file = new File(ins.toURI()); //this is line 62


       // File f = new File(getClass().getResource("/MyResource").toExternalForm());
        //String path = this.getClass().getClassLoader().getResource("/excel_List.xlsx").toExternalForm();
        //File file = new File(path);
        OPCPackage pkg = OPCPackage.open(file);
        XSSFWorkbook wb = new XSSFWorkbook(pkg);
        //FileInputStream fis=new FileInputStream(new File(excelFile));
       // XSSFWorkbook wb = new XSSFWorkbook(fis);
        XSSFSheet sheet = wb.getSheetAt(0);
        loadExcel(sheet);
        cacheNames();
      //  fis.close();
        wb.close();
    }

如果有帮助,这里是 excel 文件的路径: src\main\resources\excel_List.xlsx

更新: 所以我把excel文件从资源文件夹中取出 \nameOfMyProgram\excel_List.xlsx 现在我得到了这个错误。 我尝试了使用类加载器、类和线程的几个版本来解决来自Different ways of loading a file as an InputStream 的这个错误 但我仍然无法编译。

Error and my code

【问题讨论】:

    标签: maven io apache-poi uri executable-jar


    【解决方案1】:

    如果您必须使用 File 对象,请不要将 xls-file 放入资源目录。
    Maven 将资源目录中的所有文件放入 jar。
    Java 无法根据 jar-file 中的文件创建 File 对象。
    将您的 xls 文件放在文件系统中的某个位置,并根据其 URL 创建 File 对象。

    由于您的 xls 文件不是资源,请不要使用 getResource
    它的 URL 是它的完整文件名(带路径)。

    【讨论】:

    • 嗨。谢谢,但它仍然无法正常工作。我将文件从资源目录中取出。现在它给了我一个 FileNOTFoundError 错误。 URI 设置为空。我在上面更新了我的问题。
    • 感谢您的帮助。这帮助我更接近如何解决它。我发布了下面的代码作为答案,以便可以轻松使用。
    【解决方案2】:

    以下代码适用于 jar 可执行文件

    String path = new File("excel_List.xlsx").getAbsoluteFile().toString();
                File file = new File(path);
                if(!file.exists()){
                    JOptionPane.showMessageDialog(null,"File not found!");
                    System.exit(0);
                }
                OPCPackage pkg = OPCPackage.open(file);
                XSSFWorkbook wb = new XSSFWorkbook(pkg);
    

    【讨论】:

      猜你喜欢
      • 2012-04-26
      • 1970-01-01
      • 2011-03-14
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多