2017-11-18 80 views
0

我不知道我在做什麼錯了,因爲在我的主類運行該程序後,它完全跳過了如何檢查是否在通過文件/的FileWriter /掃描儀類的文本文件存在的用戶名

while(usernameCheck.hasNext()){ 
    //code... 
} 

循環,即使我故意把一個用戶名已經在我的「accounts.txt」文件中。我也試過方法,但很明顯,如果我把可以說「John1」和「約翰」已經在我的accounts.txt文件,它不會接受它

import java.util.Scanner; 
import java.io.*; 

public class CreateAccount { 

public static void newAccount() throws IOException{ 

    Scanner keyboard = new Scanner(System.in); 
    FileWriter fw = new FileWriter("accounts.txt",true); 
    PrintWriter pw = new PrintWriter(fw); 


    System.out.println("Please enter a username: "); 
    String user = keyboard.nextLine(); 

    File file = new File("accounts.txt"); 
    Scanner usernameCheck = new Scanner(file); 

    while(usernameCheck.hasNext()){ 
     String existingUsername = usernameCheck.nextLine(); 

     if(user.equalsIgnoreCase(existingUsername)){ 

      System.out.println("Username already exists"); 
      System.out.println("Please enter a username: "); 
      user = keyboard.nextLine(); 
     } 
    } 

    System.out.println("Please enter a password: "); 
    String pass = keyboard.nextLine(); 

    System.out.println("Account created!"); 

***閱讀我的代碼後意識到我還有另外一個問題:即使我創建了一個不存在於我的「accounts.txt」類中的用戶名,由於hasNext()方法,它仍將不斷重複提示用戶名已存在。我能做些什麼呢?

+0

什麼是您使用IDE編寫代碼?它有一個調試器嗎?如果是這樣,請遍歷代碼,看看它在做什麼。 –

+0

@Ken White我正在使用Eclipse – Sweetcharge

+0

然後它有一個調試器,對吧?你有沒有想過在同一個文件上同時打開'FileWriter'和'Scanner'會產生什麼問題? –

回答

0

我扔了這個,並測試它。它爲我找到了一個名字。我猜想發生的事情是你的文件路徑不正確。

File file = new File("accounts.txt"); 

首先查找此文本文件的完整路徑。把完整的路徑放進去,然後看看如何讓路徑更加相對。

我希望這會有所幫助。

+0

我看到我的問題是現在,代碼是在我的src文件夾和我的包文件夾中創建「accounts.txt」文件。你碰巧知道什麼可能造成這種情況? – Sweetcharge

+0

關於您在之前的回答中的評論:我還能做什麼?問題顯然是質量低下的,你的回答沒有提供任何解釋,它只是一個代碼轉儲。有些時候,我看到了很多可怕問題的答案,以及我投票的答案,但這些答案的重點是爲原始海報的問題以及如何解決問題提供一個很好的解釋,*在一般意義上*答案不僅對原始海報(OP)有所幫助,而且對未來所有訪問者都有幫助。你的只是一個代碼轉儲的答案,所以任何方式... –

+0

...你看它的質量低。 –

-1

下面顯示的代碼和您的代碼之間的區別很明顯。給用戶的提示被內循環塊包圍至少有兩個原因:

  • 如果用戶輸入一個已經包含在accounts.txt文件內,那麼用戶可以將用戶名被告知,並有機會輸入另一個用戶名。這同樣適用於密碼提示。如果提供了無效的密碼(如無),則通知用戶並有機會輸入有效的密碼。
  • 確保用戶實際輸入用戶名或密碼。

這些當然與文件寫入沒有任何關係,但增強了用戶的選擇,以確保實際上有東西寫入文件。

要閱讀accounts.txt文件時,Scanner.hasNextLine()方法使用Scanner.hasNext()方法,而不是在這裏就是爲什麼:

Scanner.hasNext ()方法被寫入與Scanner.next()方法和Scanner.hasNextLine()方法被寫入與Scanner.nextLine()方法工作的工作。

Scanner.next()方法適用於任何分隔符用作您的令牌分隔符。默認情況下,掃描程序使用空格作爲標記分隔符,因此,如果讀取的用戶名中可能有空格分隔的第一個和最後一個名稱,這將提供2個標記(名字和姓氏),這意味着您需要製作2個致電掃描儀。下一步()方法獲取完整的用戶名(每個單詞一個)。想想現在需要什麼,如果文件中有空行或文件中的用戶名前有空格。

然而,Scanner.nextLine()方法會讀取完整的文本文件行,因此它會在一次調用中讀取文件中的用戶名。您還會注意到,我還申請了String.trim()方法將Scanner.nextLine()方法的結尾:

String existingUsername = usernameCheck.nextLine().trim();

這樣做,以消除任何應該有任何文件行中的前導或尾隨製表符或空格。我們可以這樣做,因爲Scanner.nextLine()方法返回一個字符串。哦...使用Scanner.hasNext()方法可能會導致您的循環跳過。

的機制也被放置在代碼以允許用戶以退出newAccount()「輸入用戶名」提示方法。如果在此提示中提供了字母q,則該方法退出,返回;聲明。

如前所述,密碼提示也被放置在循環,以便可以完成排序驗證。目前只有一個檢查密碼實際上包含的東西已經完成,但是這可以擴展到涵蓋任何你喜歡的密碼類型驗證。也許一個特定的長度,包含特定字符類型的密碼等

下面是代碼:

public static void newAccount() throws IOException { 
    Scanner keyboard = new Scanner(System.in); 
    File file = new File("accounts.txt"); 
    FileWriter fw = new FileWriter(file, true); 
    Scanner usernameCheck = new Scanner(file); 
    String user = ""; 
    while (user.equals("")) { 
     System.out.println("Please enter a User name (q to exit): "); 
     user = keyboard.nextLine().trim(); 
     if (user.toLowerCase().equals("q")) { 
      System.out.println("User Exit!"); 
      return; // exit the method. 
     } 
     while (usernameCheck.hasNextLine()) { 
      String existingUsername = usernameCheck.nextLine().trim(); 
      if (user.equalsIgnoreCase(existingUsername)) { 
       System.err.println("Username already exists! Try Again.\n"); 
       user = ""; 
       break; 
      } 
     } 
    } 
    usernameCheck.close(); // Close the Scanner file object 
    String pass = ""; 
    while (pass.equals("")) { 
     System.out.println("Please enter a password for " + user + ": "); 
     pass = keyboard.nextLine(); 
     if (pass.equals("")) { 
      System.err.println("Invalid Password! Try Again.\n"); 
     } 
    } 

    fw.write(user + System.lineSeparator()); 
    fw.write(pass + System.lineSeparator()); 
    fw.close(); // close the FileWriter object. 

    System.out.println("Account created!"); 
} 
+0

請問我在做什麼和你做了什麼之間有什麼不同?我只是想知道將來的參考,當涉及到文件寫作等 – Sweetcharge