黑马程序员技术交流社区

标题: 一个简单的问题, 求指点 [打印本页]

作者: JinnyZh    时间: 2013-5-20 00:53
标题: 一个简单的问题, 求指点

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没区别啊, 这是什么原因!

作者: 939676244    时间: 2013-5-20 01:09
{:soso_e147:}
作者: 337091921    时间: 2013-5-20 01:24
因为x是int型啊,是4个字节啊,字节输入流只能一个一个字节的读取,所以要把int转换为byte型的啊。b1已经被转换为字节型,可以一个个读出来,int是4个字节,一次只能读一部分,就以?的形式给你读出来。如果用字符流就不会这样了。
作者: 尖卡斌引    时间: 2013-5-20 02:48
你定义的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肯定也是?号。
作者: 尖卡斌引    时间: 2013-5-20 02:48
你定义的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肯定也是?号。
作者: 尖卡斌引    时间: 2013-5-20 02:48
你定义的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肯定也是?号。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2