A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© JinnyZh 中级黑马   /  2013-5-20 00:53  /  1762 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;

public class Test1 {
//用字节流读取中文
        public static void main(String[] args) throws IOException {
                //一个中文是2个字节,且每个字节都小于0
                try(FileInputStream fis = new FileInputStream("file.txt")) {
                        //定义一个int x 用来接收
                        int x;
                        while((x = fis.read()) != -1) {
                                //判断是英文字符还是中文,英文直接输出
                                byte b1 = (byte)x;
                                if(b1 > 0) {                                                                    
                                        System.out.print((char)b1);//强转为char类型
                                } else {
                                        //如果 x < 0 则为中文就继续读取下一个字节, 将两个byte存入数组
                                        byte b2 = (byte)fis.read();
                                        byte[] arr = {b1, b2};
                                        //将数组转化为字符串
                                        String str = new String(arr);
                                        System.out.print(str);
                                }
                        }
                }

        }

}

// 上面代码中的while循环体中的if语句判断条件, 如果我将 b1 > 0 改为 x > 0, 就不会输出中文,而是一堆问号, 但是我感觉b1 和 x没区别啊, 这是什么原因!

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

5 个回复

倒序浏览
{:soso_e147:}
回复 使用道具 举报
因为x是int型啊,是4个字节啊,字节输入流只能一个一个字节的读取,所以要把int转换为byte型的啊。b1已经被转换为字节型,可以一个个读出来,int是4个字节,一次只能读一部分,就以?的形式给你读出来。如果用字符流就不会这样了。
回复 使用道具 举报
你定义的x int型的,b1 是 byte 型的,
当改为x 后,x的值为x = fis.read()) != -1

byte b1 = (byte)x;
  if(b1 > 0) {                                                                    
   System.out.print((char)b1);//强转为char类型
把这三句放在一起就是  System.out.println((char)(byte)x);
这句话,只要x为负值,打印的就是?号,
如果x为负值,走的就是else
这byte[] arr 中存储就是 {b1 ,b2}
其中 b1= (byte)x
       b2 =(byte)x
也就是说,b1 和b2 是一样的,都是负数。打印arr肯定也是?号。
回复 使用道具 举报
你定义的x int型的,b1 是 byte 型的,
当改为x 后,x的值为x = fis.read()) != -1

byte b1 = (byte)x;
  if(b1 > 0) {                                                                    
   System.out.print((char)b1);//强转为char类型
把这三句放在一起就是  System.out.println((char)(byte)x);
这句话,只要x为负值,打印的就是?号,
如果x为负值,走的就是else
这byte[] arr 中存储就是 {b1 ,b2}
其中 b1= (byte)x
       b2 =(byte)x
也就是说,b1 和b2 是一样的,都是负数。打印arr肯定也是?号。

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
你定义的x int型的,b1 是 byte 型的,
当改为x 后,x的值为x = fis.read()) != -1

byte b1 = (byte)x;
  if(b1 > 0) {                                                                    
   System.out.print((char)b1);//强转为char类型
把这三句放在一起就是  System.out.println((char)(byte)x);
这句话,只要x为负值,打印的就是?号,
如果x为负值,走的就是else
这byte[] arr 中存储就是 {b1 ,b2}
其中 b1= (byte)x
       b2 =(byte)x
也就是说,b1 和b2 是一样的,都是负数。打印arr肯定也是?号。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马