2013-01-10 36 views
0

我有一個文本文件被寫入網絡文件夾,我希望我的用戶能夠單擊將在文本文件中讀取的jar文件,對其進行排序,以及將已排序的文件輸出到相同的文件夾。但我無法格式化InputStream的語法來讀取文件。如何從jar中讀取外部文本文件

當我使用一個FileReader代替InputStreamReader下面的代碼在日食罰款,但是從罐子中運行時返回空的。當我將其更改爲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(); 
    } 
} 

} 

回答

0

getResourceAsStream()從類路徑加載文件。如果您是從命令行運行它,則需要類路徑中的當前目錄(.)。如果要從文件系統加載任意文件,則應使用FileInputStream(或FileReader以保存必須隨後將輸入流包裝在閱讀器中)。

+0

我嘗試使用FileReader這樣,但它寫出一個文件,說「它沒有真正的工作」(我沒有閱讀任何東西的默認通知)。 –

+0

嘗試{ \t \t \t \t \t \t字符串sCurrentLine; \t \t \t br = new BufferedReader(new FileReader(「./ input.IDX」)); \t \t \t而((sCurrentLine = br.readLine())!= NULL){ \t \t \t \t的System.out.println(sCurrentLine); \t \t \t} \t \t \t br.close(); \t \t} catch(IOException e){ \t \t \t e.printStackTrace(); \t \t} –

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()); 
    } 
}