2012-06-08 57 views
0

我們假設創建一個方法 •文件中的行數 •文件中的字數和 •字符數文件不包含空格。 即文件:xxx.txt有120行,317個字,4154個字符使用LineNumberReader類顯示行/字/#行

•逐行搜索給定字符串的文件。輸出必須包含行號,後跟包含搜索參數的行的內容。例如給予以下爲輸入字符串:Java中,其中Java是搜索字符串輸出將是這樣的:

5:關於Java

9:JAVA的人熱愛JAVA。

使用class LineNumberReader本練習

我有困難的時候。當我運行我的代碼時,我總是收到I/O錯誤,說關閉了流。

這是我的代碼。我有部分的線條,文字,字符。但我不能讓第二部分工作

public String wordCount() 
{ 
    try 
    { 
     int wordCount = 0, 
      numberCount = 0, 
      lineCount = 1, 
      characterCount = 0; 

     String c = " "; 

     FileReader r = new FileReader(f); 
     LineNumberReader lnr = new LineNumberReader(r); 
     StreamTokenizer t = new StreamTokenizer(r); 
     ArrayList <String> results = new ArrayList<String>(); 


     t.resetSyntax(); 
     t.whitespaceChars(0, ' '); 
     t.wordChars('a','z'); 
     t.wordChars('A','Z'); 
     t.wordChars('0','9'); 

     t.eolIsSignificant(true); 

     while(t.nextToken() != StreamTokenizer.TT_EOF) 
     { 
      switch(t.ttype) 
      { 
      case StreamTokenizer.TT_NUMBER: 
       numberCount++; 
       break; 
      case StreamTokenizer.TT_WORD: 
       characterCount += t.sval.length(); 
       wordCount++; 
       break; 
      case StreamTokenizer.TT_EOL: 
       lineCount++; 
       break; 
      case StreamTokenizer.TT_EOF: 
       break; 
       default: 

      } 
     } 

     r.close(); 
    BufferedReader bf = new BufferedReader(new FileReader(f)); 
    BufferedWriter out = new BufferedWriter(new FileWriter("test.txt")); 
    BufferedWriter output = new BufferedWriter(new FileWriter("output.txt")); 
    int recCount = 0; 
    String record = null; 
     while ((record = bf.readLine()) != null) { 
      recCount++; 
      out.write(recCount + ": " + record); 
      out.newLine(); 
     } 
    out.close(); 


    String ask = "Enter Word"; 

String find = JOptionPane.showInputDialog(ask); 
String word = find; 


while(lnr.readLine() != null) 
    { 
     String line = lnr.readLine(); 
     if (line.indexOf(word) >= 0) 
     { 
      results.add(lnr.getLineNumber() + line); 
     } 
    } 
    lnr.close(); 


     String str = f.getName() + " has " + lineCount + " line(s), " + 
       wordCount + " word(s), " + 
       characterCount + " characters. " + "\n These lines contain" 
       + "the word in search of:" ; 
     for(int index=0; index<results.size();index++) 
     { 
      if(results !=null) 
      { 
       str+= results.get(index) + "\n"; 
      } 
     } 

    return str; 
    } 

我注意到它突破了這部分代碼。如果我將代碼註釋掉,那麼我會減去我正在嘗試執行的部分。

String ask = "Enter Word"; 

String find = JOptionPane.showInputDialog(ask); 
String word = find; 


while(lnr.readLine() != null) 
    { 
     String line = lnr.readLine(); 
     if (line.indexOf(word) >= 0) 
     { 
      results.add(lnr.getLineNumber() + line); 
     } 
    } 
lnr.close(); 

回答

4

在你的循環

while(lnr.readLine() != null) 

您嘗試從lnr,依靠r,您先前關閉的閱讀。

解決方法:在完全完成文件之前,請勿關閉r。由於您要再次打開該文件,最簡單的方法是在r.close()之前移動上述循環,因爲循環不取決於out的結果。

而且,當你寫

while(lnr.readLine() != null) 
{ 
    String line = lnr.readLine(); 

你跳過線(你讀一個在循環狀態,這被丟棄,那麼你讀下一行到line你可以這樣做,而不是:

String line = null; 
while((line = lnr.readLine()) != null) 
{ 
    // rest of the loop 

這將讀取下一行,將其分配到line和每次執行循環時檢查null

+0

感謝。我忘了把r.close放在頂部。 現在我無法得到我想要完成的第二部分工作。數組列表中沒有顯示任何內容。 – user1444775

0

我認爲你的問題可能是該行

r.close(); 

正在關閉你的文件句柄。所以當你試着從後面讀取時,你就再也看不到它了。嘗試刪除該關閉。

編輯: 見阿提拉更詳細的答案:)