从java中的文件中随机读取一个字符?

时间:2014-08-22 21:16:40

标签: java file-io

在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

}

}

2 个答案:

答案 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,识别字节序列也很简单:

  • 高位= 0时的单字节
  • 否则为高位10
  • 时的连续字节
  • 否则是一个起始字节(有一些特殊情况)通过高位来告诉字节数。

对于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错误的编码,你会得到胡言乱语。如果您在文件中选择一个任意点并开始阅读,并且该位置不是角色编码的开始,那么您将获得乱码。其中一个或两个都发生在您的案件中。