我正在使用 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 用户可能将文件存储在 C:\users\somebody\devtimer\file.csv 中。文件存储在/home/somebody/devtimer/file.csv中。
干杯 吉姆
最佳答案
您的文件已打包到 *.jar 中 一旦文件位于 jar 中,您就无法使用路径将其作为文件访问(因为,如果您考虑一下,它不再是文件。它位于另一个文件(jar 文件)中)。
你需要做这样的事情:
InsputStream csvStream = this.getClass().getResourceAsStream("filmdb.csv");
然后您可以将此输入流传递给您的 csv 解析器。 但您将无法对该文件进行任何修改。您想要更改的任何文件都需要存储在 jar 之外。
对于文件路径,像new File("somename")
这样的东西是相对于当前工作目录解析的。如果你想知道你的根在哪里,请尝试以下操作:
System.err.println(new File(".").getCanonicalPath());
这对应用程序执行时的工作目录非常敏感,而这又取决于它的执行方式等。
关于Java加载外部CSV文件编译成Jar后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24991507/