0

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

当我使用 aFileReader而不是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();
    }
}

}
4

2 回答 2

0

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

于 2013-01-10T21:35:04.973 回答
0

使用 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());
    }
}
于 2013-01-10T21:56:32.317 回答