【问题标题】:Is it possible to get the directory of a class package within a .jar?是否可以在 .jar 中获取类包的目录?
【发布时间】:2018-03-05 18:18:45
【问题描述】:

我正在尝试在我的 .jar 中以 File 的形式获取类包的目录(层次结构为 /controller/core):

File directory_file_of_package = new File(getClass().getResource("/controller/core").toURI());

当我在 IDE 中运行程序时,它可以工作,但是当我将它作为独立的 .jar 运行时,它给了我这个错误:

java.lang.IllegalArgumentException: URI is not hierarchical

查看这些问题(why my URI is not hierarchical?Java Jar file: use resource errors: URI is not hierarchical)对我没有帮助,因为这些问题涉及在 .jar 中获取 File 作为资源(getResourceAsStream()),但我想要获取的是一个目录。

此外,接受的答案是这样的:

通常,IDE 将文件系统类和资源分开。但是当罐子被创建时,它们被放在一起。

那么,有没有办法抓取/controller/core的目录呢?

我的 XY 问题:

我正在尝试使用 CSVJDBC (http://csvjdbc.sourceforge.net/) 读取 .CSV 文件,DriverManager 引用 CSV 文件的方式就像 包含文件夹数据库CSV 文件表格

public class SearchData {

    void SearchData() {
        try {
            Class.forName("org.relique.jdbc.csv.CsvDriver");

            File directory_file_of_package_containing_csv = new File(getClass().getResource("/controller/core").toURI());

            // Driver points to directory which contains the CSV file as if it is the database
            Connection conn = DriverManager.getConnection("jdbc:relique:csv:" + directory_file_of_package_containing_csv.toString());
            System.out.println("Connection established.");
            Statement stmt = conn.createStatement();
            System.out.println("Statement created.");

            // CSV is named "data.csv" so the CsvDriver sees "data" as the table name
            String sql = "SELECT id,name FROM data";

            ResultSet results = stmt.executeQuery(sql);

            ...

        } catch (ClassNotFoundException | SQLException | URISyntaxException e) {
            e.printStackTrace();            
        }
    }
}

如何将 CsvJdbc 指向 .jar 中包含的 csv 文件?

【问题讨论】:

    标签: java jar uri java-io csvjdbc


    【解决方案1】:

    JAR 中根本没有包的目录。它可以在 IDE 中运行,因为您的类尚未打包在 JAR 文件中并且驻留在某个目录中。但 JAR 并非如此。

    因此,如果您使用的某些库需要一个包含文件的目录,您通常无法使用类路径资源来实现这一点。一种选择是将资源的副本创建为临时目录中的文件。

    或者您可能想更深入地研究CsvJDBC documentation

    要读取保存在 Java 应用程序中的数据(例如,在 JAR 文件中)或远程访问的数据(例如,使用 HTTP 请求),请创建一个实现接口 org.relique.io.TableReader 的 Java 类并提供该类连接 URL 中的名称。然后,CsvJdbc 创建该类的一个实例,并调用getReader 方法为正在读取的每个数据库表获取java.io.Reader

    所以你应该能够在没有临时目录的情况下为 CsvJDBC 解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      相关资源
      最近更新 更多