2013-08-30 4 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

Из этих 3-х линий, это выглядит, как вы сохраняете имя игрока, а затем монеты-кол ...

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 - первый вариант. Но имя пользователя (carlos) сохраняется в файле .dat. – user2734151

+1

Использование Eclipse не имеет никакого отношения к тому, является ли код правильным или нет. Я отредактирую свой ответ, чтобы быть более ясным. – Stewart

+0

Нет .. мой код: Player.playerName = l.String(); и я получил сообщение об ошибке, после чего Eclipse сказал мне изменить его на Player.playerName = l.нанизывать(); – user2734151

2

Изменить

Player.playerName = l.toString(); 

в

Player.playerName = l.readUTF(); 

Как правило, вы должны использовать что-то вроде PrintWriter для записи файлов. Вам не нужно писать операции низкого уровня, такие как writeUTF или writeInt. Вы можете сразу сделать

printWriter.println(playerName); 

И при чтении, либо использовать Scanner или BufferedReader

+0

Я только начал писать и загружать файлы. : $ – user2734151

+1

@ user2734151 Загрузка и чтение одинаковы, я думаю. – bsd

2

Это неправильно:

Player.playerName = l.toString(); 

Вы не читаете какие-либо данные из DataInputStream здесь, вы просто преобразование объекта DataInputStream в строку. Звонок readUTF() вместо toString():

Player.playerName = l.readUTF(); 
Смежные вопросы