使用csv文件导出java应用程序

时间:2014-11-17 12:41:25

标签: java csv executable-jar

我有一个java应用程序,其中我使用了两个excel文件(.csv文件)作为输入。我想制作该java应用程序的runnable jar。但是当我运行那个java项目作为runnable jar导出之后jar它不包含两个输入csv文件。

任何人都可以帮助我如何使用csv文件导出java应用程序。

以下是我用来访问csv文件的代码行

  String csvFile = "./input/silkair.Schedule1 (1).csv";

 //InputStream inputStream = getClass().getResourceAsStream(csvFile);
    BufferedReader br = null;


//          br = new BufferedReader(new InputStreamReader(inputStream));
            br = new BufferedReader(new FileReader(csvFile));

1 个答案:

答案 0 :(得分:0)

如果你想从jar中读取CSV文件,那么它们必须包含在jar中。使用jar tvf your.jar或zip实用程序进行检查。如果从jar中读取文件,请将InputStreamReadergetResourceAsStream一起使用。

如果你想从文件系统中读取CSV文件,那么你需要将它们放在文件系统上,而不是放在jar中(或者在运行之前从jar中提取它们)。如果从文件系统读取文件,请使用FileReader和文件系统文件名。

这是一个示范......

两个源文件 - 一个从jar读取,一个从文件系统读取:

$ cat ReadFile.java
import java.io.*;
public class ReadFile {
public static void main(String[] args) throws IOException {
        String csvFile = args[0];
        BufferedReader reader = new BufferedReader(new FileReader(csvFile));
        String line;
        while((line = reader.readLine()) != null) {
                System.out.println(line);
        }
}
}

$ cat ReadResource.java
import java.io.*;
public class ReadResource {
public static void main(String[] args) throws IOException {
        String csvFile = args[0];
        BufferedReader reader = new BufferedReader(new InputStreamReader(ReadResource.class.getResourceAsStream(csvFile)));
        String line;
        while((line = reader.readLine()) != null) {
                System.out.println(line);
        }
}
}

jar的内容 - _input_/my.csv处的CSV文件:

$ jar tvf readtest.jar
     0 Mon Nov 17 12:58:04 GMT 2014 META-INF/
    71 Mon Nov 17 12:58:04 GMT 2014 META-INF/MANIFEST.MF
   697 Mon Nov 17 12:52:30 GMT 2014 ReadFile.class
   842 Mon Nov 17 12:52:30 GMT 2014 ReadResource.class
     0 Mon Nov 17 12:47:38 GMT 2014 _input_/
    16 Mon Nov 17 12:47:20 GMT 2014 _input_/my.csv

文件系统的内容 - input/my.csv处的CSV文件:

$ mv _input_/ input
$ find .
.
./input
./input/my.csv
./ReadFile.class
./ReadFile.java
./ReadResource.class
./ReadResource.java
./readtest.jar

使用ReadFile,您可以从文件系统中读取,但不能从jar:

读取
$ java -cp readtest.jar ReadFile input/my.csv
foo,bar
bar,foo

$ java -cp readtest.jar ReadFile _input_/my.csv
Exception in thread "main" java.io.FileNotFoundException: _input_\my.csv (The system cannot find the path specified)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:106)
        at java.io.FileInputStream.<init>(FileInputStream.java:66)
        at java.io.FileReader.<init>(FileReader.java:41)
        at ReadFile.main(ReadFile.java:5)

使用ReadResource,您可以从jar中读取,但不能从文件系统中读取:

$ java -cp readtest.jar ReadResource input/my.csv
Exception in thread "main" java.lang.NullPointerException
        at java.io.Reader.<init>(Reader.java:61)
        at java.io.InputStreamReader.<init>(InputStreamReader.java:55)
        at ReadResource.main(ReadResource.java:5)

$ java -cp readtest.jar ReadResource _input_/my.csv
foo,bar
bar,foo