【问题标题】:DataInputStream and DataOutputStream [closed]DataInputStream 和 DataOutputStream [关闭]
【发布时间】:2013-09-03 14:54:00
【问题描述】:

我制作了自己的缓冲写入器,它可以工作。但不知道是不是真的?

我在注销时创建了一个缓冲阅读器,我有(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;
    }

}

如何让它正确保存所有(整数)?

【问题讨论】:

  • 什么缓冲写入器?什么缓冲区?什么作家?这里只有一个 DataOutputStream,它既不是缓冲也不是 Writer。
  • 你为什么将“SavePlayer”设置为“true”,然后立即测试它是否为“false”?这是没有意义的。
  • 而且您无需致电File.createNewFile()。调用 new FileOutputStream() 会这样做。

标签: java java-io datainputstream dataoutputstream


【解决方案1】:

从这 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()读回数据。

点赞。

【讨论】:

  • 使用Eclipse与代码是否正确无关。我将编辑我的答案以使其更清楚。
  • 你完全忽略了我的意思。您使用o.writeUTF() 保存。你应该回读l.readUTF()。没有对应于l.toString()o.fromString()
  • 所以你“修复”错了。再试一次。所有这些答案都在告诉你同样的事情,而且它们都是正确的(到目前为止)。您应该能够解决自己的语法错误。
  • 也许您想在您的问题中添加一个确切的错误消息,或者您遇到的确切现象?您之前说过您确定是作者而不是读者,但我只是在阅读器中发现了一个错误。你怎么知道失败的是作者?您是否正在检查输出文件的十六进制转储?
  • 注意:StackOverflow 不是论坛。答案中的 cmets 不适合讨论您的代码。
【解决方案2】:

改变

Player.playerName = l.toString();

Player.playerName = l.readUTF();

通常你应该使用PrintWriter 之类的东西来写文件。您不必编写像writeUTFwriteInt 这样的低级操作。你可以直接做

printWriter.println(playerName);

阅读时,请使用ScannerBufferedReader

【讨论】:

  • 我刚刚开始如何编写和加载文件。 :$
  • @user2734151 我猜加载和读取是一样的。
【解决方案3】:

这是错误的:

Player.playerName = l.toString();

您没有从DataInputStream 读取任何数据,您只是将DataInputStream 对象转换为字符串。调用readUTF() 而不是toString()

Player.playerName = l.readUTF();

【讨论】:

    猜你喜欢
    • 2013-03-12
    • 2017-12-31
    • 1970-01-01
    • 2012-03-23
    • 2018-03-07
    • 1970-01-01
    • 2012-02-13
    • 2018-03-09
    • 1970-01-01
    相关资源
    最近更新 更多