IO流学习笔记

在这里插入图片描述

IO,即in和out,也就是输入和输出,指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。

流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道,程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘中

字节流和字符流的区别

  1. 字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的 – byte数组(1024)
  2. 如果使用字节流处理中文,如果一次读写一个字符对应的字节数就不会有问题,一旦将一个字符对应的字节分裂开来,就会出现乱码了。为了更方便地处理中文这些字符,Java就推出了字符流。
  3. 字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串, 而字节流处理单元为1个字节,操作字节和字节数组
  4. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以 使用字节流读取中文文件 1个中文 GBK:占用两个字节 UTF-8:占用3个字节 字节流根据字节数定义缓冲区长度
  5. 字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容

节点流和处理流

  1. 节点流:直接操作数据读写的流类,比如FileInputStream
  2. 处理流:对一个已存在的流进行封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能,例如BufferedInputStream(缓冲字节流)
  3. 程序与磁盘的交互相对于内存运算是很慢的,容易成为程序的性能瓶颈。减少程序与磁盘的交互,是提升程序效率一种有效手段。缓冲流,就应用这种思路:普通流每次读写一个字节,而缓冲流在内存中设置一个缓存区,缓冲区先存储足够的待操作数据后,再与内存或磁盘进行交互。这样,在总数据量不变的情况下,通过提高每次交互的数据量,减少了交互次数

字节与字符

  1. ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。
  2. UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。
  3. 符号:英文标点为一个字节,中文标点为两个字节。例如:英文句号 . 占1个字节的大小,中文句号 。占2个字节的大小。
  4. Unicode 编码中,一个英文为一个字节,一个中文为两个字节
  5. UTF-16 编码中,一个英文字母字符或一个汉字字符存储都需要 2 个字节(Unicode 扩展区的一些汉字存储需要 4 个字节)
  6. UTF-32 编码中,世界上任何字符的存储都需要 4 个字节。

缓冲流

  1. 如果请求长度超过输出缓冲区的大小,刷新输出缓冲区,然后直接写入数据。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值