在RandomAccessFile类中使用readChar()读取文件时,会出现意外输出。 而不是所需的角色?显示。
package tesr;
import java.io.RandomAccessFile;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
try{
RandomAccessFile f=new RandomAccessFile("c:\\ankit\\1.txt","rw");
f.seek(0);
System.out.println(f.readChar());
}
catch(IOException e){
System.out.println("dkndknf");
}
// TODO Auto-generated method stub
}
}
答案 0 :(得分:1)
您可能打算readByte
。 Java char是UTF-16BE,一个2字节的Unicode表示,并且随机二进制数据通常不可表示,没有正确的UTF-16BE或半正式代理" - 组成一个Unicode代码点的两个char的组合的一部分。 Java表示您的案例中的转换失败为问号。
如果你知道文件的编码是什么,那么对于单字节编码来说很简单:
byte b = in.readByte();
byte[] bs = new byte[] { b };
String s = new String(bs, "Cp1252"); // Some single byte encoding
对于可变多字节UTF-8,识别字节序列也很简单:
对于UTF-16LE和UTF-16BE,文件位置必须是2和2个字节长的倍数。
byte[] bs = new byte[2];
in.read(bs);
String s = new String(bs, StandardCharsets.UTF_16LE);
答案 1 :(得分:1)
您几乎肯定会遇到字符编码问题。无法简单地从文件中读取字符。必须做的是读取适当的字节序列,然后根据字符编码方案解释这些字节,将它们转换为字符。当您想要将文件作为文本读取时,必须告知Java,或许隐含地使用哪种字符编码。
如果你告诉Java错误的编码,你会得到胡言乱语。如果您在文件中选择一个任意点并开始阅读,并且该位置不是角色编码的开始,那么您将获得乱码。其中一个或两个都发生在您的案件中。