【问题标题】:How to read an external text file from jar如何从 jar 中读取外部文本文件
【发布时间】:2012-12-25 09:57:28
【问题描述】:

我有一个写入网络文件夹的文本文件,我希望我的用户能够单击一个 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();
    }
}

}

【问题讨论】:

    标签: java file-io jar inputstream


    【解决方案1】:

    getResourceAsStream() 从类路径加载文件。如果您从命令行运行它,则需要类路径上的当前目录 (.)。如果你想从文件系统加载任意文件,你应该使用FileInputStream(或FileReader来省去随后在阅读器中包装输入流的麻烦)。

    【讨论】:

    • 我尝试像这样使用 FileReader,但它会写出一个文件,上面写着“它并没有真正工作”(我的默认通知是没有读取任何内容)。
    • 尝试 { String sCurrentLine; br = new BufferedReader(new FileReader("./input.IDX")); while ((sCurrentLine = br.readLine()) != null) { System.out.println(sCurrentLine); } br.close(); } catch (IOException e) { e.printStackTrace(); }
    【解决方案2】:

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

    此外,要访问 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());
        }
    }
    

    【讨论】: