面试避坑手册之 Java字节流和字符流总结IO流!

从接收输入值说起

在日常的开发应用中,有时候需要直接接收外部设备如键盘等的输入值,而对于这种数据的接收方式,我们一般有三种方法:字节流读取,字符流读取,Scanner 工具类读取。

字节流读取

直接看一个例子:

public class Demo01SystemIn {
   
    public static void main(String[] args) throws IOException {
   
        int a = System.in.read();
        System.out.println(a);
        char c = 'a';
        System.out.println((int) c);
    }
}

运行程序之后,会被 read 方法阻塞,这时候在控制台输入一个字符 a,那么上面的程序两句话都会输出 97,这个没问题,因为小写字母 a 对应的就是 97,那么假如我们输入一个中文会出现什么结果呢?

把上面示例中的 a 修改为 中,然后运行程序,在控制台同样输入 中,则会得到 228 和 20013,这就说明我们控制台输入的 中 并没有全部读取,原因就是 read 只能读取 1 个字节,为了进一步验证结论,我们将上面的例子进行改写:

public class Demo01SystemIn {
   
    public static void main(String[] args) throws IOException {
   
        char a = (char) System.in.read();//读取一个字节
        System.out.println(a);
        char c = '中';
        System.out.println(c);
    }
}

运行之后得到如下结果:


可以看到,第一个输出乱码了,因为 System.in.read() 一次只能读取一个字节,而中文在 utf-8 编码下占用了 3 个字节。正因为 read 方法一次只能读取一个字节,所以其范围只能在 -1~255 之间,-1 表示已经读取到了结尾。

那么如果想要完整的读取中文应该怎么办呢?

字符流读取

我们先看下面一个例子:

public class Demo01SystemIn {
   
    public static void main(String[] args) throws IOException {
   
        InputStreamReader inputStreamReader1 = new InputStreamReader(System.in);
        int b = inputStreamReader1.read();//只能读一个字符
        System.out.println(b);

        InputStreamReader inputStreamReader2 = new InputStreamReader(System.in);
        char[] chars = new char[2];
        int c = inputStreamReader2.read(chars);//读入到指定char数组,返回当前读取到的字符数
        System.out.println
  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java架构没有996

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值