2012-03-20 41 views
0

我正在從源讀取InputStream(fis),並且在其上必須執行多重搜索。我正在使用Scanner類,並在每次搜索後對其進行實例化。但它只是第一次。有沒有辦法重置掃描儀對象?我無法控制流。InputStream無法運行的Java掃描器

Scanner sc = new Scanner(new BufferedReader(new InputStreamReader(
       fis, MIFConstants.ENCODING_UTF_8))); 
     int count = 0; 
     while (sc.hasNextLine()) { 
      count++; 
      sc.nextLine(); 
     } 
     System.out.println(count); 

     sc = new Scanner(new BufferedReader(new InputStreamReader(fis, 
       MIFConstants.ENCODING_UTF_8))); 
     count = 0; 
     while (sc.hasNextLine()) { 
      count++; 
      sc.nextLine(); 
     } 
     System.out.println(count); 

第二次打印返回零。有關於此的任何想法?

+0

爲什麼你需要評估和打印兩次文件中的行數? – EJP 2012-03-20 01:25:10

+0

我必須一次又一次地在輸入流中搜索一些行。所以我必須在同一個流上進行多次掃描。我的第一個掃描工作,但下一個不會導致它已經達到EOF。我想如果我創建一個新的掃描儀對象,它應該從流的開始處開始。任何其他方式我可以處理這個? – 2012-03-20 01:39:32

+0

您*無法*在同一個流上執行多次掃描,如上所示。你將不得不重新打開它。但是這是非常低效的。您應該在文件的一次掃描中掃描需要掃描的所有內容。 – EJP 2012-03-20 01:41:13

回答

0

只需創建一個Scanner,然後每次重新使用它。問題正在發生,因爲BufferedReader`沒有留下任何可掃描的信息。

+0

這是錯誤的解決方案和錯誤的原因。即使他根本沒有「BufferedInputStream」,也會發生這種情況。原因是他在EOS上讀到'fis',所以當他再次做這件事時,沒有什麼可以閱讀的。 – EJP 2012-03-20 01:23:41

+0

他也在創建第二個'BufferedReader'。這不是問題。 – Manish 2012-03-20 01:24:13

0

第二次打印返回零。

因爲您已經第一次讀到EOS計數行的流。所以當你再次做的時候,還有零線要計算,所以你得到零。

按設計工作。