如何在Java中读取文件的2字节符号并转换为short类型?
问题分析与解决方案
你的核心问题出在文件编码读取不匹配和输出逻辑错误上,另外Java的字符处理模型和C语言有本质区别,别用C的思路套Java。
问题拆解
- 编码不匹配:
FileReader会用当前操作系统默认编码读取文件,如果你存储sąłs的ala.xs是UTF-8编码,而系统默认编码不是UTF-8(比如Windows的GBK),读取到的ł会变成乱码数值,后续转char自然显示异常。 - 输出时机错误:你尝试的
System.out.println((char)words[i]);如果是在循环结束后执行,此时i已经指向数组未赋值的位置(比如循环结束后i=4),访问words[i]拿到的是初始值0,转char是不可见字符,当然看不到效果。 - 类型转换潜在风险:
Reader.read()返回的是int类型的Unicode码点(范围0~65535),强制转short时,若遇到码点超过Short.MAX_VALUE(32767)的字符会溢出,你的示例字符没问题,但最好做判断规避风险。
修正后的代码
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; public class Main { public static void main(String[] args) throws IOException { short[] words = new short[10]; // 指定UTF-8编码读取,避免平台编码差异导致乱码 try (Reader reading = new InputStreamReader(new FileInputStream("ala.xs"), "UTF-8")) { int codePoint; int i = 0; while ((codePoint = reading.read()) != -1 && i < words.length) { // 仅处理能存入short的码点,防止溢出 if (codePoint <= Short.MAX_VALUE) { words[i] = (short) codePoint; // 直接转char输出,还原原字符 System.out.print((char) words[i]); i++; } } } // try-with-resources自动关闭流,无需手动调用close } }
关键改动说明
- 指定编码读取:改用
InputStreamReader+FileInputStream,明确指定UTF-8编码,确保无论操作系统默认编码是什么,都能正确解析sąłs中的特殊字符。 - 安全类型转换:先判断码点是否在short范围内再转存,避免溢出问题。
- 正确输出:在循环内直接输出转char后的数组元素,用
System.out.print代替println,避免每个字符换行,还原原文件的字符串形式。 - 自动资源管理:使用try-with-resources语法,无需手动关闭流,避免资源泄漏。
补充说明
Java的char是16位Unicode字符(对应UTF-16编码单元),而C语言的char通常是8位字节,这是两者核心区别。你在C中用printf("%c")能正常显示,是因为C读取的是文件字节,再按系统编码解析;但Java的Reader直接读取Unicode码点,必须保证读取编码和文件实际编码一致,才能拿到正确的字符值。
内容的提问来源于stack exchange,提问作者Michał Jagodzinski
相关产品推荐
相关产品推荐

