黑马程序员——IO流(三)字节流、字符流、转换流

------- android培训java培训、期待与您交流! ----------

一、字节流和字符流

   字节流是以InputStream和OutputStream为基类的一系列类,是对字节的直接操作。而字符流(Reader、Writer),需要根据系统的码表做一些转义操作。字符流更着重于文本的操作。

 

二、带缓冲区的字节流原理

    缓冲输入流中定义一个字节数组来存放读取的字节,一次性装满或直到底层字节流返回-1,然后由输出流从此缓冲区读取数据,写入到相应位置;当缓冲区的内容读取结束后,就会重复上次的动作。这样就节省了输入流每从硬盘上读取一个数据就和输出流打交道的时间、资源。

    (注:cpu处理内存的速度远大于对硬盘及其他外部设备的速度)

     这里涉及到一个问题:

     一个字节在内存中是用8个二进制数表示,即(0101001010。。。),而在缓冲区有可能会出现连续8个1的情况,用byte来表示就是-1,那么输出流将终止,而用int来表示还是-1。解决的办法就是byte在转int的时候,前面补0,这样既保存了原来的数据,int接受后也不是-1.

       所以,在api中不论是OutputStream还是其子类,他们的writer(int b)方法都是:

      

   (更详细信息,请参看黑马程序员基础视频教程第1914讲)

 

三、键盘输入、转换流

     1、InputStreamReader (字节流——>字符流)

      System.in返回的是标准输入流,一般指键盘。他也是一个字节流(InputStream)。通过InputStreamReader可将字节流转为字符流,使操作更加便捷。InputStreamReader作为Reader的子类,可以使用BufferedReader来装饰,达到更好的效果。

 



    2、OutputStreamWriter(字符流——>字节流)

    和InputStreamReader相同的是他们的参数都是字节流,这就可以更好的分辨二者的区别。InputStreamReader是输入流,那么参数是字节流(进来),就是向字符流转换;而OutputStreamWriter是输出流,参数也是字节流(出去),显然是从字符流向字节流转换。

    这里需要注意的是,字符流的输出需要flush方法才能输出结果。

    另:通过BufferedWriter对OutputStreamWriter的装饰,可以跨平台的换行(newLine)

 

四、转换流、指定编码

    当我们遇到使用指定的编码表来存储数据的时候,就要使用转换流来处理。在OutputStreamWriter的构造方法中,除了需要一个字节流外,还有一个重载的方法,需要指定一个字符集。

    当对使用指定字符集(和系统默认的不同)存储的数据读取时,也需要使用到转换流,即InputStreamReader,并需要指定相同的字符集。

五、IO使用规律

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值