黑马程序员技术交流社区
标题:
一个简单的问题, 求指点
[打印本页]
作者:
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