RandomAccessFile的意外输出

时间:2015-01-15 20:42:09

标签: java randomaccessfile

我试图了解RandomAccessFile,但在创建测试程序后,我得到了一些奇怪的输出。

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomAccessFileTest
{
    public static void main(String[] args) throws IOException
    {
        // Create a new blank file
        File file = new File("RandomAccessFileTest.txt");
        file.createNewFile();

        // Open the file in read/write mode
        RandomAccessFile randomfile = new RandomAccessFile(file, "rw");

        // Write stuff
        randomfile.write("Hello World".getBytes());

        // Go to a location
        randomfile.seek(0);

        // Get the pointer to that location
        long pointer = randomfile.getFilePointer();
        System.out.println("location: " + pointer);

        // Read a char (two bytes?)
        char letter = randomfile.readChar();
        System.out.println("character: " + letter);

        randomfile.close();
    }
}

此程序打印出来

  

位置:0

     

字符:?

事实证明,字母的价值是'䡥'什么时候应该是' H'

我发现了一个与此相似的问题,显然这是由于读取一个字节而不是两个字节引起的,但它并没有解释如何解决它。

1 个答案:

答案 0 :(得分:1)

你已经写过" Hello World"在平台默认编码中 - 每个字符可能使用一个字节。

然后您正在阅读RandomAccessFile.readChar,它总是读取两个字节。文档:

  

从此文件中读取字符。此方法从文件中读取两个字节,从当前文件指针开始。如果按顺序读取的字节是b1和b2,其中0 <= b1,b2 <= 255,则结果等于:

   (char)((b1 << 8) | b2)
     

此方法将一直阻塞,直到读取两个字节,检测到流的末尾,或者抛出异常。

因此He合并为一个字符 - H是U + 0048,e是U + 0065,所以假设他们是&#39; ve被写成ASCII字符,你正在读取字节0x48和0x65并将它们组合成U+4865,这是&#34;移动购物车&#34;的汉字字符。

基本上,您不应该使用readChar来尝试读取此数据。

通常,要阅读文本文件,您需要InputStreamReader(使用适当的编码)换行InputStream(例如FileInputStream)。尝试使用RandomAccessFile执行此操作并不是很理想 - 您可以将数据读入byte[],然后将其转换为String但是你需要考虑各种各样的细微之处。