2011-12-17 74 views
-1

我想自己幫忙,我製作了一個文件來創建一個用戶文件,因爲我打算製作一個遊戲。它有一個登錄名,寫入登錄名,顯示名稱和密碼。它將它寫出到以登錄名稱命名的文件中。Java如何閱讀特定行

現在我想使用java編寫一個登錄腳本。我想知道具體如何閱讀該行和已輸入的密碼。

我擁有它,因此當它創建文件時,它將密碼保存兩次,一次作爲「playerPass」,一次作爲「currPass」,這樣,如果有人計劃更改密碼(我將從登錄腳本),那麼使用playerPass變量將currPass作爲正確的密碼讀取。無論如何,我希望它使用BufferedReader和FileReader讀取指示密碼和當前密碼的行,以便可以登錄。

有人可以幫我解決這個問題嗎?我仍然是一個新手。

PS。我可以調整代碼,我只需要一些關於如何編寫代碼的解釋。

變量:

playerLogName 
playerName 
playerPass 
currPass 

文件名:

Login.java 
CharacterFileCreator.java 

的一個相加,得到了它一半的工作,但在我輸入密碼,不管它鎖定了(使用Java博士)什麼我這樣做,不正確或正確,和System.out.println()永遠不會執行,即使密碼不正確。檢查它:

import java.util.Scanner; 
import java.io.BufferedWriter; 
import java.io.BufferedReader; 
import java.io.FileWriter; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.FileNotFoundException; 

class Login { 

    public static void LogIn(){ 
    boolean loggedIn = false; 
    loggedIn = true; 
    System.out.println("You are now logged in!"); 
    } 

    public static void main(String[] args) { 
    System.out.println("What is your login name?"); 
    Scanner charLogName = new Scanner(System.in); 
    String playerLogName = charLogName.nextLine(); 
    boolean charFileFound = false; 
    BufferedReader characterfile = null; 

    try { 
     characterfile = new BufferedReader(new FileReader("./game/characters/" + playerLogName + ".txt")); 
     charFileFound = true; 
    } 
    catch (FileNotFoundException fileex1) {} 
    if(charFileFound == false){ 
     System.out.println("Login name does not exist!"); 
    } 
    else 
    { 
     System.out.println(playerLogName + ": is your username, what is your password?"); 
     Scanner charPassword = new Scanner(System.in); 
     String playerPass = charPassword.nextLine(); 
     String line = ""; 
     String token = ""; 
     String token2 = ""; 
     int ReadMode = 0; 
     try { 
     line = characterfile.readLine(); 
     } catch (IOException ioexception) { 
     System.out.println(playerLogName + ": error loading file."); 
     } 
     while (line != null) { 
     line = line.trim(); 
     int spot = line.indexOf("="); 
     if (spot > -1) { 
      token = line.substring(0, spot); 
      token = token.trim(); 
      token2 = line.substring(spot + 1); 
      token2 = token2.trim(); 
      switch (ReadMode) { 
      case 1: 
       if (token.equals("character-password")) { 
       if (playerPass.equals(token2)) { 
       LogIn(); 
       } else { 
       System.out.println("You entered an incorrect password!"); 
       } 
       break; 
      } 
      } 
     }   else { 
      if(line.equals("[ACCOUNT]")) { 
      ReadMode = 1; 
      } 
      else if(line.equals("[EOF]")) { 
      try { 
       characterfile.close(); 
      } catch (IOException ioexception) { 
      } 
      } 
     } 
     } 
    } 
    } 
} 

編輯:

樣本文件:

[ACCOUNT] 
character-loginname = SampleFile 
character-password = samplepassword 
[EOF] 
+0

在你的問題中顯示一個示例文件。 – 2011-12-17 11:09:22

+1

*「抱歉的傢伙,它的4:15在這裏哈哈。」*不是一個有效的藉口。如果你的立場是你必須爲一個不好的問題找藉口,那麼這是一個好兆頭,你不應該問這個問題,或者應該延遲詢問它,直到你適合這樣做。 -1 – 2011-12-17 11:17:37

回答

0

它可能是更容易使用屬性文件!你仍然可以給它任何你想要的文件擴展名,甚至可以根據你的意願對它進行加密,但是通過使用屬性對象,你可以得到或設置任何屬性,而不管行號!

看看這裏的一個例子:http://www.exampledepot.com/egs/java.util/Props.html

UPDATE:我發現你的問題 - 你永遠不會讀取文件的下一行的while循環,所以你可能會發現,如果你把System.out.println(line);地方內的循環,它會繼續顯示「[ACCOUNT]」 - 文件的第一行!

要解決此問題,我可能傾向於將整個循環放在trycatch語句中,並將條件更改爲while((line = characterfile.readLine()) != null)。這樣,每個循環都使用下一行,但根據情況,在捕捉異常方面可能存在問題。

或者,你可以在測試時if (token.equals("character-password"))添加line = characterfile.readLine();設置ReadMode 1後,您if(line.equals("[ACCOUNT]"))聲明,並作爲else語句....

但是,如果你聽從我的建議,並使用Properties文件您將不需要執行任何循環來獲取字符數據,因爲您可以像示例鏈接所示的那樣調用諸如password = propertyObject.getyProperty("password")之類的東西。

HTH