BufferedReader读取及BufferedWriter写入后.ddm文件内容异常问题求助
看起来你遇到了.ddm文件读写后内容乱码的问题,我来帮你拆解可能的原因和对应的解决办法。
核心原因排查
1. 文件编码不匹配(最常见诱因)
你当前使用的FileReader和FileWriter依赖系统默认字符编码处理文件,但你的.ddm文件大概率使用了其他编码(比如UTF-8、UTF-16等)。当编码不匹配时,字节会被错误解析为字符,就会出现你看到的大量分号、空格这类乱码内容。
举个例子:如果原文件是UTF-8编码,但你的系统默认编码是GBK,读取时UTF-8字节会被按GBK规则解析,直接导致字符错乱;写入时又用GBK编码保存,会进一步放大乱码问题。
2. 分隔符变量的拼写与值错误
你的代码里用到了seperatorString(注意拼写错误,正确写法是separatorString),如果这个变量的值不是";",那么line.split(seperatorString)就无法正确分割每行的tile数据。比如不小心设成空字符串或其他字符,split后的数组会完全不符合预期,后续解析和写入自然会出错。
具体解决步骤
第一步:强制指定编码读写文件
替换FileReader/FileWriter为InputStreamReader/OutputStreamWriter,并明确指定与原文件一致的编码(可以用Notepad++查看原文件编码:打开原文件,右下角会显示编码类型,比如UTF-8)。
修改读取代码:
// 替换原FileReader部分,指定UTF-8编码(根据实际编码调整) BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8));
如果涉及写入操作,同样指定编码:
// 写入时使用与原文件一致的编码 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), StandardCharsets.UTF_8));
第二步:修复分隔符变量
把代码里的seperatorString改为正确的separatorString,并明确设置分隔符为";":
String separatorString = ";"; // 明确指定tile数据的分隔符
第三步:验证写入逻辑(若涉及文件回写)
如果你的代码需要将解析后的ScreenMap写回文件,要确保每行的tile值用;分隔,且每行末尾添加换行符,和原文件格式保持一致。示例逻辑如下(根据你的ScreenMap结构调整):
// 示例写入逻辑,对应读取时的坐标反转逻辑 for (int y = height - 1; y >= 0; y--) { StringBuilder lineBuilder = new StringBuilder(); for (int x = 0; x < width; x++) { if (x != 0) { lineBuilder.append(";"); } // 替换为你获取tile值的实际方法 int tileValue = result.getTile(x, y); lineBuilder.append(tileValue); } bw.write(lineBuilder.toString()); bw.newLine(); }
额外调试建议
- 用Notepad++打开原文件,确认编码类型,确保读写时使用的编码完全匹配。
- 调试时打印
tiles数组的内容,确认split后的每个元素是否是预期的数字(0、1、2、5等),如果不是,说明分隔符或编码仍有问题。
内容的提问来源于stack exchange,提问作者AndideBob

