BufferedWriter 没有将 Map 的内容写入文本文件;我的世界服务器

BufferedWriter is not writing contents of Map to text file; Minecraft server

我有 PVPStats 对象存储在 PlayerMeta.java:

public static Map <UUID, PVPstats> sPVPStats = new HashMap<>();

我确定地图中填充了包含每个 uuid 的预期变量的对象。

当服务器在 Main.java

中调用 onDisable() 时,我试图将这些对象(转换为单行字符串)写入 plugins/core/killstats.txt

除了 Map 对象,PlayerMeta.java 中还有从 Map 更新和检索 PVPStats 对象的方法。这些都有效。

不工作的部分是写入方法:

public static void writePVPStats() throws IOException {
        
        BufferedWriter w = new BufferedWriter(new FileWriter("plugins/core/killstats.txt"));
        
        sPVPStats.keySet().forEach(user -> {            
            try {
                System.out.println(sPVPStats);
// stdout = {a6b6e3a1-a1ec-4fee-9d6d-f5e495c3e9d7=a6b6e3a1-a1ec-4fee-9d6d-f5e495c3e9d7:1:0}
                
                w.write(user.toString() + "\n");
                w.flush();
                
              } catch (IOException e) {
                  throw new UncheckedIOException(e);
              }
        });
        w.close();
    }

kill.txt onDisable() 完成后:

a6b6e3a1-a1ec-4fee-9d6d-f5e495c3e9d7

相反,它需要是:

{a6b6e3a1-a1ec-4fee-9d6d-f5e495c3e9d7=a6b6e3a1-a1ec-4fee-9d6d-f5e495c3e9d7:1:0}

供参考,here is the complete PVPStats class.

最后,如果重要/有帮助,服务器启动时的reader:

Files.readAllLines(killstats_user_database.toPath()).forEach(line -> {
            PVPstats stats = PVPstats.fromString(line);
            PlayerMeta.sPVPStats.put(stats.playerid, stats);
        });

源代码:

backend.FileManager.java

backend.PlayerMeta.java

backend.PVPstats.java

events.PVP.java

编辑

我刚刚用 killstats.txt 文件类型尝试过,现在 killstats.txt 没有任何内容。

public static void writePVPStats() throws IOException {
        
        BufferedWriter w = new BufferedWriter(new FileWriter("plugins/core/killstats.txt"));
        
        for (PVPstats object: sPVPStats.values()) {
            try {
                System.out.println(sPVPStats);
                
                w.write(object.toString() + "\n");
                w.flush();
                
              } catch (IOException e) {
                  throw new UncheckedIOException(e);
              }
        };
        w.close();
    }

好的,所以有多个问题。我没有控制缓冲区的刷新,我错误地声明了 hasmap,我没有访问哈希映射的值部分,我没有正确地执行纯文本。

解决方案

public static Map <UUID, PVPstats> sPVPStats = new HashMap<UUID, PVPstats>();
    public static void writePVPStats() throws IOException {
        
        BufferedWriter w = new BufferedWriter(new FileWriter("plugins/core/killstats.txt"));
        
        for (PVPstats object: sPVPStats.values()) {
            try {
                System.out.println(sPVPStats);
                System.out.println(object.toString());
                
                w.write(object.toString() + "\n");
                w.flush();
                
              } catch (IOException e) {
                  throw new UncheckedIOException(e);
              }
        };
        w.close();
    }