【问题标题】:Java load external CSV file not working after compiling to Jar编译到 Jar 后 Java 加载外部 CSV 文件不起作用
【发布时间】:2014-07-28 08:49:28
【问题描述】:

我正在使用 NetBeans 编写一个 Java 程序,该程序对开发黑白胶片的过程进行了计时。其中一个选项允许您手动设置时间,另一个选项允许您选择所选胶片和显影剂,以从加载到数组中的 CSV 文件计算所需时间。

加载了 3 个文件,filmdb.csv、masterdb.csv 和 usersettings.csv。前两个加载纯粹是为了读取,第三个文件加载并且也可以写入以保存用户的默认设置。

所有3个文件都存储在项目目录中,并以与以下代码类似的方式加载并从main调用:

static String[] filmArray;
static int filmRows = 125;
int selectedDevTime;
int tempDevTime;
int minDevTime;
int secDevTime;
public int count = -1;

static void createFilmArray() {
    filmArray = new String[filmRows];

    Scanner scanLn = null;
    int Rowc = 0;
    int Row = 0;
    String InputLine = "";
    String filmFileName;

    filmFileName = "filmdb.csv";

    System.out.println("\n****** Setup Film Array ******");

    try {
        scanLn = new Scanner(new BufferedReader(new FileReader(filmFileName)));

        while (scanLn.hasNextLine()) {
            InputLine = scanLn.nextLine();
            filmArray [Rowc] = InputLine;
            Rowc++;
        }
    } catch (Exception e) {
        System.out.println(e);
    }        
}

当我在 NetBeans 中按下运行按钮时一切正常,所有文件都已加载并存储到适当的数组中,但是当我将文件构建为 .jar 时,文件未加载,我尝试将 3 个文件复制到与 .jar 相同的目录以及将 3 个文件导入到 .jar 存档中,但没有任何乐趣。

是否有应该放置文件的特定位置,或者应该以不同的方式导入它们?

我宁愿不从绝对目录加载它们,例如 Windows 用户可能将文件存储在 C:\users\somebody\devtimer\file.csv 中,而 Linux 用户可能有/home/somebody/devtimer/file.csv中存储的文件。

干杯 吉姆

【问题讨论】:

    标签: java csv netbeans file-io jar


    【解决方案1】:

    您的文件已打包到 *.jar 一旦文件在 jar 中,您就无法使用路径将其作为文件访问(因为,如果您考虑一下,它不再是文件。它的 inside 是另一个文件,即 jar 文件)。

    你需要这样做:

    InsputStream csvStream = this.getClass().getResourceAsStream("filmdb.csv");
    

    然后您可以将此输入流传递给您的 csv 解析器。 但是,您将无法对文件进行任何修改。您想要更改的任何文件都需要存储在 jar 之外。

    至于文件路径,像new File("somename") 这样的东西是相对于当前工作目录解析的。如果您想知道您的根目录在哪里,请尝试以下操作:

    System.err.println(new File(".").getCanonicalPath());
    

    这对你的应用程序执行时的工作目录非常敏感,而这又取决于how 究竟它是被执行的等等。

    【讨论】:

    • 感谢您的帮助,需要能够修改其中一个文件。如何链接到 .jar 之外的文件?
    • @TheVDM - 访问 jar 之外的文件(文件系统上的真实文件)与您的代码相同。我怀疑您停止查找文件的原因是因为执行 jar 时当前工作目录不同。尝试打印出 CWD 并查看
    • 将用于写入的资源用作只读模板。将其复制到用户目录下的File 并使用它。 System.getProperty("user.home") 是主目录。
    【解决方案2】:

    如果您从 csv 文件所在的同一目录运行 jar,那么它应该正在加载。如果你只是双击罐子,可能会有一些问题。您可以创建一个由文件名表示的新文件并检查绝对路径以找出 jar 的运行位置。

    如果要将 csv 包含在 jar 中(用于分发的清洁器),则需要以不同的方式加载文件。 See this question 就是一个很好的例子。

    【讨论】:

    • 谢谢,我已经尝试使用“java -jar devtimer.jar”从终端运行 .jar 文件,它现在正在加载外部 CSV 文件,所以我最好的选择是创建一个 bash从当前目录运行 jar 文件的脚本。
    猜你喜欢
    • 1970-01-01
    • 2016-04-10
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多