Java File技术疑问:能否使用readUTF读取文本文件中的字符串?
Can you use
readUTF() to read strings from a text file in Java? 哥们儿,这个问题得掰扯清楚:技术上你能调用这个方法,但绝对不推荐这么做,几乎一定会出问题。
原因很简单,readUTF()是DataInputStream类里的方法,它从设计之初就不是用来读取普通文本文件的——它的专属配对方法是DataOutputStream.writeUTF()。当你用writeUTF()写字符串时,JVM会先写入两个字节的长度标识(用来表示后续UTF-8编码的字节数),再写入字符串的UTF-8字节内容。
但普通文本文件(比如你用记事本创建的.txt)根本没有这个前置的长度字节。如果你直接用readUTF()去读,它会把文本开头的两个字节当成长度值,然后尝试读取对应长度的字节:
- 如果文本总长度不够,直接抛出
EOFException; - 如果侥幸读够了字节,读出来的内容也是完全乱码的,因为它把原本的文本内容当成了带长度标识的二进制数据来解析。
举个直观的例子:
- 用
writeUTF("Hello")写入的内容,实际存储的字节序列是:0x00 0x05 48 65 6C 6C 6F(前两个字节是长度5,后面是Hello的UTF-8字节); - 普通文本文件里的"Hello",存储的就是
48 65 6C 6C 6F,没有前面的长度字节。
那读取普通文本文件该用啥?推荐用专门处理字符流的工具:
BufferedReader+FileReader(适合逐行读取文本);Files.readString()(Java 11+,直接读取整个文件为字符串,简洁高效);- 如果需要指定编码,用
InputStreamReader配合指定字符集(比如StandardCharsets.UTF_8)。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

