javaIO之字符流是怎么读取的?

最近在看io相关的知识,遇到一些小问题,以下有例子来说明问题:
比如:
12345 是一个十进制数
根据ASCII码找到是 :
二进制 00110001 00110010 00110011 00110100 00110101
十进制4950515253
十六进制 0x310x320x330x340x35
文件以ansi编码保存为:

clipboard.png

文件以unicode编码保存:

clipboard.png

文件以utf-8编码保存:

clipboard.png

问题一:为什么以unicode保存是这样的(不是应该3100 3200 3300 3400 3500就完了吗),ff fe是个什么鬼呢?不是很明白。。。
问题二:以字节流读取的话,如果读取的是文本文件,应该要设置编码的吧?
问题三:字符流的话,是怎么读取的,比如我现在文件现在以ansi保存,那里面应该是 31 32 33 34 35。如果以字符流读的话怎么读呢?我看到网上说

clipboard.png

可我明明是以ansi保存的,哪来的unicode的呢?难道读的时候会转为unicode,然后再去读???可以讲下详细的过程吗??

谢谢各位大神!

阅读 2.2k
1 个回答

问题一:
FFFE -> BOM -> Byte order mark 字节序标识
字节顺序标记(英语:byte-order mark,BOM)是位于码点U+FEFF的统一码字符的名称。当以UTF-16或UTF-32来将UCS/统一码字符所组成的字符串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的记号。

参见:
字节顺序标记

问题二:
是的。
问题三:
读取时设置文件编码,如:

InputStream input = new FileInputStream("data/text.txt");

    try(InputStreamReader inputStreamReader =
        new InputStreamReader(input,"ISO-8859-1")){
    
        int data = inputStreamReader.read();
        while(data != -1) {
            System.out.print((char) data);
            data = inputStreamReader.read();
        }
        
    }    
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题