2016-03-15 79 views
2

比方說,我在我的文本文件,這樣的文字:閱讀文本文件中的字符串

VOTED/1/hannah/18 
NOT VOTING/2/janice/20 

,我有這樣的代碼:

File Orig_outFile = new File("C:\\voters.txt"); 
BufferedReader infile = new BufferedReader(new FileReader(Orig_outFile)); 

vNum=JOptionPane.showInputDialog("Enter voters number: "); 
String line=""; 
String something="VOTED"; 
while(infile.readLine()!=null){ 
    line=infile.readLine(); 
    String [] info=line.split("/"); 

    if(info[1].matches(vNum)){ 
    while(info[0].matches(something)){ 
     JOptionPane.showMessageDialog(null, "Voter already voted or Voter not registered. Please try again"); 
     vNum=JOptionPane.showInputDialog("Enter voters number: "); 
    } 
    President(); 
    } 
} 
infile.close(); 

任務是需要用戶輸入選民號碼,然後閱讀文本文件,然後如果發現文本文件中的info[0]包含VOTED,它將收到錯誤消息並需要再次輸入其選民號碼。我假設我的錯誤是我使用while循環兩次?

+0

此代碼在發生異常時會泄漏'infile'資源。 – Raedwald

回答

2

其實你正在做infile.readLine()並通過再次做infile.readLine()追加下一行字符串line讀一本線while

你最終只會讀取文件中的第二行。你應該改變你的while循環,如下所示:

while((line = infile.readLine()) != null) 

,並刪除下面的語句:

line = infile.readLine(); 

以下是更正後的代碼片段:

File Orig_outFile = new File("C:\\voters.txt"); 
BufferedReader infile = new BufferedReader(new FileReader(Orig_outFile)); 

vNum = JOptionPane.showInputDialog("Enter voters number: "); 
String line = null; 
String something = "VOTED"; 
while((line = infile.readLine()) != null) { 
    String [] info = line.split("/"); 

    /* Assuming You Are Entering Voter's Number & Not Voter's Name */ 
    if(info[1].equalsIgnoreCase(vNum)) { 
     if(info[0].equalsIgnoreCase(something)) { 
      JOptionPane.showMessageDialog(null, "Voter already voted or 
              Voter not registered. Please try again"); 
      /* Please Note That You Are Currently Iterating File */ 
      /* If You Do This Here, You'll End Up Checking Same Records */ 
      /* You'll Have To Replace Outer `if` with `while` */ 
      vNum = JOptionPane.showInputDialog("Enter voters number: "); 
     } else { 
      President(); 
      break; 
     } 
    } 
} 
infile.close(); 

這裏有一個更清晰的方法實施它:

  1. 讀取存儲器中的完整文件(最好用Map鍵 - >選通號碼)。

  2. 取用戶的選民號碼,並檢查它是否存在於地圖中。

  3. 如果它在Map中不存在或者值等於VOTED則重複Step 2

這裏是代碼片段:

File Orig_outFile = new File("C:\\voters.txt"); 
BufferedReader infile = new BufferedReader(new FileReader(Orig_outFile)); 
Map<String,String> map = new HashMap<>(); 
String something = "VOTED"; 

String line = null; 
while((line = infile.readLine()) != null) { 
    String [] info = line.split("/"); 
    map.add(info[1],info[0]); 
} 
infile.close(); 

while(true) { 
    vNum = JOptionPane.showInputDialog("Enter Voter's Number: "); 
    if(map.contains(info[1]) && !map.get(info[1]).equalsIgnoreCase(something)) { 
     President(); 
     break; 
    } else { 
     JOptionPane.showMessageDialog(null, "Voter already voted or 
              Voter not registered. Please try again"); 
    } 
} 
+0

哦,沒有什麼事情發生。它仍然是一樣的,它甚至不會讀取文本文件或類似的東西。它會跳過if和while條件,然後轉到President()方法 – pep

+0

@pep我希望你輸入類似'18'的東西作爲選民號碼而不是選民名稱。在這種情況下,它不應該是'info [2]'而不是'info [1]'? – user2004685

+0

哦,我只是注意到,我現在編輯我的問題。其實選民的號碼是在信息[1]和信息[3]或18是年齡:)是的,我會嘗試這個,我會讓你知道,如果它的作品:) – pep

2

調用infile.readLine()實際上從文件中讀取一行,返回並移動到下一行。要調用它兩次,一次在while循環條件:

line = infile.readLine(); 

你應該只把它曾經在while循環的條件和分配:

while(infile.readLine() != null) 
在循環的第一線

並再次值爲line變量,如下所示:

while((line = infile.readLine()) != null) 
+0

我以爲我在下面的回答中提到了同樣的事情? – user2004685