Проблема с фрагментами кода Java - PullRequest
0 голосов
/ 03 апреля 2012
    public class GenericWorldLoader implements WorldLoader {
    @Override
    public LoginResult checkLogin(PlayerDetails pd) {
        Player player = null;
        int code = 2;
        File f = new File("data/savedGames/" + NameUtils.formatNameForProtocol(pd.getName()) + ".dat.gz");
        if(f.exists()) {
            try {
                InputStream is = new GZIPInputStream(new FileInputStream(f));
                String name = Streams.readRS2String(is);
                String pass = Streams.readRS2String(is);
                if(!name.equals(NameUtils.formatName(pd.getName()))) {
                    code = 3;
                }
                if(!pass.equals(pd.getPassword())) {
                    code = 3;
                }
            } catch(IOException ex) {
                code = 11;
            }
        }
        if(code == 2) {
            player = new Player(pd);
        }
        return new LoginResult(code, player);
    }

    @Override
    public boolean savePlayer(Player player) {
        try {
            OutputStream os = new GZIPOutputStream(new FileOutputStream("data/savedGames/" + NameUtils.formatNameForProtocol(player.getName()) + ".dat.gz"));
            IoBuffer buf = IoBuffer.allocate(1024);
            buf.setAutoExpand(true);
            player.serialize(buf);
            buf.flip();
            byte[] data = new byte[buf.limit()];
            buf.get(data);
            os.write(data);
            os.flush();
            os.close();
            return true;
        } catch(IOException ex) {
            return false;
        }
    }

    @Override
    public boolean loadPlayer(Player player) {
        try {
            File f = new File("data/savedGames/" + NameUtils.formatNameForProtocol(player.getName()) + ".dat.gz");
            InputStream is = new GZIPInputStream(new FileInputStream(f));
            IoBuffer buf = IoBuffer.allocate(1024);
            buf.setAutoExpand(true);
            while(true) {
                byte[] temp = new byte[1024];
                int read = is.read(temp, 0, temp.length);
                if(read == -1) {
                    break;
                } else {
                    buf.put(temp, 0, read);
                }
            }
            buf.flip();
            player.deserialize(buf);
            return true;
        } catch(IOException ex) {
            return false;
        }
    }

}

Да, так ... Моя проблема в том, что это, кажется, сохраняет «что-то» очень сложным и трудным для чтения способом (двоичным), и я бы предпочел иметь его в формате .txt, в легко читаемом формате.как конвертировать?

РЕДАКТИРОВАТЬ: я не использую Apache Mina, так что я должен заменить

IoBuffer buf = IoBuffer.allocate(1024);
buf.setAutoExpand(true);" 

на?

1 Ответ

0 голосов
/ 03 апреля 2012

checkLogin() явно проверяет, есть ли в указанном логине соответствующие данные и правильный ли пароль.

savePlayer() метод спасает игрока.

loadPlayer() загружает его снова.

Используемый формат данных: gzip ( wiki ) и записывается в виде потока сериализованных данных. Если вы хотите сделать его более читабельным, вам может потребоваться перегрузить (или просто использовать его, если это хорошо) метод toString() класса Player и записать player.toString() в новый текстовый файл, например, с помощью. BufferedWriter , обернутый вокруг File Writer :

String playerName = NameUtils.formatNameForProtocol(player.getName());
BufferedWriter writer = new BufferedWriter(new FileWriter(playerName + ".txt"));
writer.write(player.toString());
writer.close();
...