编译到Jar后,Java加载外部CSV文件无法正常工作

时间:2014-07-28 08:49:29

标签: java csv netbeans file-io jar

我正在使用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 中的文件。

干杯 吉姆

2 个答案:

答案 0 :(得分:1)

您的文件已打包到* .jar中 一旦文件在jar中,你就不能使用路径作为文件访问(因为,如果你考虑它,它不再是文件。它的里面另一个文件,jar文件)。

你需要做这样的事情:

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

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

对于文件路径,new File("somename")之类的东西是相对于当前工作目录解析的。如果你想知道你的root在哪里尝试:

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

这将对您的应用程序执行时的工作目录非常敏感,而这又取决于how确切地执行了应用程序等。

答案 1 :(得分:0)

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

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