如何从jar读取外部文本文件

时间:2013-01-10 21:32:17

标签: java file-io jar inputstream

我有一个文本文件被写入网络文件夹,我希望我的用户能够点击一个jar文件,该文件将读入文本文件,对其进行排序,并将排序后的文件输出到同一文件夹。但是我无法格式化InputStream的语法来读取文件。

当我使用FileReader而不是InputStreamReader时,以下代码在eclipse中工作正常,但从jar运行时返回空。当我将其更改为InputStream时,就像我的研究建议一样 - 我得到一个NullPointerException,就像找不到文件一样。

我哪里出错了? :)

public class sort {

    /**
     * @param args
     */
    public static void main(String[] args) {
        sort s = new sort();
        ArrayList<String> farmRecords = new ArrayList<String>();
        farmRecords = s.getRecords(); 

        String testString = new String(); 
        if(farmRecords.size() > 0){
            //do some work to sort the file

        }else{
            testString = "it didn't really work"; 
        }
        writeThis(testString); 
    }



public ArrayList<String> getRecords(){
        ArrayList<String> records = new ArrayList(); 
        BufferedReader br; 
        InputStream recordsStream = this.getClass().getResourceAsStream("./input.IDX");
        try {

            String sCurrentLine;
            InputStreamReader recordsStreamReader = new InputStreamReader(recordsStream);
            br = new BufferedReader(recordsStreamReader);
            while ((sCurrentLine = br.readLine()) != null) {
                System.out.println(sCurrentLine); 
            }
            br.close();

        } catch (IOException e) {
            e.printStackTrace();
        } 

        return records; 
}

private static void writeThis(String payload){
    String filename = "./output.IDX"; 
    try {
        BufferedWriter fr = new BufferedWriter(new FileWriter(filename));
        fr.write(payload);
        fr.close();
    } catch (IOException e) {

        e.printStackTrace();
    }
}

}

2 个答案:

答案 0 :(得分:0)

getResourceAsStream()从类路径加载文件。如果从命令行运行此命令,则需要类路径上的当前目录(.)。如果要从文件系统加载任意文件,则应使用FileInputStream(或FileReader以保存随后将输入流包装在阅读器中。)

答案 1 :(得分:0)

使用FIS获取jar中的文件将不起作用,因为该文件本身不在文件系统上。你应该使用getResrouceAsStream()。

另外,要访问jar中的文件,必须添加“!”到文件路径。 jar里面的文件是?如果没有,那么在传递类路径后尝试脚本启动jar:

start.sh

    java -cp .:your.jar com.main.class.example.run

执行此脚本(在Linux上)或根据您的平台修改它。

此外,您可以使用以下代码打印出类路径。这样你可以检查你的类路径是否包含文件吗?

ClassLoader sysClassLoader = ClassLoader.getSystemClassLoader();

    // Get the URLs
    URL[] urls = ((URLClassLoader) sysClassLoader).getURLs();

    for (int i = 0; i < urls.length; i++) {
        System.out.println(urls[i].getFile());
    }
}