2013-08-30 66 views
-2

我製作了自己的緩衝寫入器。但我不知道它是否確實如此?DataInputStream和DataOutputStream

我在註銷時製作了一個緩衝讀取器(200個硬幣),當我登錄時我得到了(545453個硬幣)或其他數量,我確定它是緩衝寫入器,請幫助!

public static int coins; 
private static final String DIR = "./Data/"; 
    public static boolean SavePlayer; 

    public static void saveAll() { 
     SavePlayer = true; 
     if (!SavePlayer) { 
      System.out.println("[WoG Error]: Their was an error saving players."); 
      return; 
     } 
     saveGame(); 
    } 

    public static boolean saveGame() { 
     if (Player.playerName == null) { 
      return false; 
     } 
     try { 
      File file = new File(DIR + Player.playerName.toLowerCase() + ".dat"); 
      if (!file.exists()) 
       file.createNewFile(); 
      FileOutputStream fileOutputStream = new FileOutputStream(file); 
      DataOutputStream o = new DataOutputStream(fileOutputStream); 
      o.writeUTF(Player.playerName); 
      o.writeInt(Player.coins); 
      //o.writeInt(Player.height); 
      o.close(); 
      fileOutputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return false; 
     } 
     return true; 
    } 

    public static boolean loadGame() throws InterruptedException { 
     try { 
      File file = new File(DIR + Player.playerName.toLowerCase() + ".dat"); 
      if (!file.exists()) { 
       System.out.println("[WoG Error] Sorry but the account does not exist."); 
       return false; 
      } 
      FileInputStream fileInputStream = new FileInputStream(file); 
      DataInputStream l = new DataInputStream(fileInputStream); 
      Player.playerName = l.toString(); 
      Player.coins = l.readInt(); 
      //Player.height = l.readInt(); 
      l.close(); 
      fileInputStream.close(); 
      Player.home(); 
     } catch (final IOException e) { 
      e.printStackTrace(); 
      return false; 
     } 
     return true; 
    } 

}

如何正確地做它保存所有(整數)?

+2

什麼緩衝作家?什麼緩衝區?什麼作家?您在這裏所擁有的只是一個DataOutputStream,它既沒有緩衝也沒有Writer。 – EJP

+1

爲什麼你將'SavePlayer'設置爲'true',然後立即測試'false'?沒有用。 – EJP

+0

而你不需要調用'File.createNewFile()'。調用'new FileOutputStream()'做到這一點。 – EJP

回答

5

從這些三線,它看起來像要保存玩家的名字,然後投幣式個性化......

DataOutputStream o = new DataOutputStream(fileOutputStream); 
o.writeUTF(Player.playerName); 
o.writeInt(Player.coins); 

,然後嘗試這樣再次讀取它們放回:

DataInputStream l = new DataInputStream(fileInputStream); 
Player.playerName = l.toString(); // <-- change to l.readUTF() 
Player.coins = l.readInt(); 

我注意到您正在使用l.toString()而不是l.readUTF()

當然,您需要使用相應的方法讀回數據以保存它?

換句話說,如果您使用o.writeUTF()保存數據,則需要使用l.readUTF()讀回數據。

喜歡喜歡。

+0

我確定我在使用Eclipse,而l.toString是第一個選項。但是playername(carlos)保存在.dat文件中。 – user2734151

+1

使用Eclipse與代碼是否正確無關。我會編輯我的答案,以便更清楚。 – Stewart

+0

不..我的代碼是這樣的:Player.playerName = l.String();我得到一個錯誤,然後Eclipse告訴我把它改成Player.playerName = l。的toString(); – user2734151

2

變化

Player.playerName = l.toString(); 

Player.playerName = l.readUTF(); 

一般來說,你應該使用類似PrintWriter寫入文件。您不必編寫像writeUTFwriteInt這樣的低級操作。你可以直接做

printWriter.println(playerName); 

而且一邊讀書,要麼使用ScannerBufferedReader

+0

我剛開始如何編寫和加載文件。 :$ – user2734151

+1

@ user2734151加載和閱讀是一樣的,我猜。 – bsd

2

這是錯誤的:

Player.playerName = l.toString(); 

你是不是讀從這裏DataInputStream任何數據,你只是將DataInputStream對象轉換爲字符串。致電readUTF()而不是toString()

Player.playerName = l.readUTF();