整数转单字节字符写入文件后UTF-8解码异常问题求助
解决整数转指定字节写入文件的编码问题
你的核心问题是混淆了「原始字节写入」和「字符编码写入」:Java的char是基于UTF-16的Unicode字符,当你把(char)245这类值转成String后,用UTF-8写入文件时,会自动将Unicode字符编码为UTF-8对应的多字节(比如õ对应0xC3B5,±对应0xC2B1),这和你需要直接写入0xB1、0xF5原始字节的需求完全冲突。
解决方案:直接操作字节流写入
跳过String/Character的转换环节,直接将整数拆分后的高低位转为字节,用字节输出流写入文件,彻底避免字符编码的干扰。
修正后的写入代码
import java.io.FileOutputStream; import java.io.IOException; public class RawByteWriter { public static void main(String[] args) { int targetInt = 45557; // 拆分出高低位字节(强制转byte,Java byte是有符号类型,但写入时会保留原始字节值) byte highByte = (byte) ((targetInt >> 8) & 0xFF); // 对应0xB1 byte lowByte = (byte) (targetInt & 0xFF); // 对应0xF5 // 使用字节输出流直接写入原始字节 try (FileOutputStream fos = new FileOutputStream("output.raw")) { fos.write(highByte); // 先写高位字节0xB1 fos.write(lowByte); // 再写低位字节0xF5 // 控制台验证字节值(&0xFF是为了将有符号byte转为无符号整数显示) System.out.printf("高位字节十六进制: 0x%02X%n", highByte & 0xFF); System.out.printf("低位字节十六进制: 0x%02X%n", lowByte & 0xFF); } catch (IOException e) { e.printStackTrace(); } } }
后续读取还原整数的代码
如果需要读取文件还原原始整数,同样用字节流处理:
import java.io.FileInputStream; import java.io.IOException; public class RawByteReader { public static void main(String[] args) { try (FileInputStream fis = new FileInputStream("output.raw")) { byte[] buffer = new byte[2]; fis.read(buffer); // 还原整数:高位字节左移8位,与低位字节做或运算 int restoredInt = ((buffer[0] & 0xFF) << 8) | (buffer[1] & 0xFF); System.out.printf("还原的整数: %d%n", restoredInt); // 输出45557 System.out.printf("十六进制表示: 0x%04X%n", restoredInt); // 输出0xB1F5 } catch (IOException e) { e.printStackTrace(); } } }
关键说明
- 必须使用
FileOutputStream这类字节流,而非FileWriter等字符流,后者会默认用系统编码或指定编码处理字符,破坏原始字节。 - 拆分字节时用
& 0xFF确保获取正确的8位无符号值,避免Java有符号byte的数值偏差。
内容的提问来源于stack exchange,提问作者Oniguirii
相关产品推荐
相关产品推荐

