字节缓冲流和字符缓冲流的恩怨情仇


前言

字节缓冲流和字符缓冲流只有一字之差,却有着很大的区别。更是它们相互之间缠绕不休的处境。


一、 字节流写数据

  字节流中的输入字节流超类是InputStream
  字节流中的输出字节流超类是OutputStream
  子类名称都是以父类名称做为子类名的后缀的
FileOutputStream:文件输出流用于将数据写入File中
  FilOutputStream(String name):创建文件输出流以指定的名称写入文件

1.1 字节流写数据的重要步骤

  1. 创建FileOutputStream对象,关联到一个文件路径
     1.1:创建字节输出流对象
      1.1.1:调用系统功能创建了文件
      1.1.2:创建字节输出流对象
      1.1.3:让字节输出流对象指向文件
  2. 调用write()方法,写出数据
  3. 调用close()方法,释放资源
  4. 打开文件,查看内容

1.2 字节流写数据的三种方式

void write(int b)
  将指定的字节写入此文件输出流一次写一个字节数据
void write(byte[] b)
  将b.length字节从指定的字节数组写入此文件输出流一次写一个字节数组数据
void write(byte[] b,int off,int len)
  将len字节从指定字节数组开始,从偏移量off开始写入此文件输出流一次写一个字节数组的部分数据
off:偏移量,也就是数组的下标
len:长度,也就是想要输出的数组中的多少个字节

1.3 如何写换行

调用write()方法,写出"\r\n".getBytes()即可

1.4 如何文件续写

  1. 使用FileOutputStream(String name,boolean append)构造方法
  2. 构造方法中的第二个参数传递true,则在文件末尾继续写数据

1.5 字节流写数据加异常处理

  1. finally:在异常处理时提供finally块来执行所有清楚操作。比如说IO流中的释放资源
      特点:被finally控制的语句一定会执行,除非JVM退出
  2. 重要步骤
      将创建字节流对象和写出数据的代码放在try中
      在catch中捕获IOException异常
      在finally中进行释放资源

1.6 字节流读数据(一次读一个字节数据)

  1. 需求:把文件fos.txt中的内容读取出来在控制台输出
  2. FileInputStream:从文件系统中的文件获取输入字节
      FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name来命名
  3. 使用字节输入流读数据的步骤
      创建字节输入流对象
      调用字节输入流对象的读数据方法
      释放资源

二、 字符流

2.1 为什么出现字符流

  1. 由于字节流操作中文不是特别的方便,所以Java就是提供字符流
      字符流=字节流+编码表
  2. 用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼成中文,如何识别是中文的呢?汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数。

2.2 编码表

  1. 基础知识:
    1.1:计算机中存储的信息都是用二进制数表示的;
    1.2:按照某种规则,将字符存储到计算机中,称为编码。反之,将存储在计算机中的二进制数按照某种规则解析显示出来的,称为解码。
    1.3:字符编码:就是一套自然语言的字符与二进制数之间的对应规则(A , 65)
  2. UTF-8编码:
      可以用来表示Unicode标准中任意字符,它是电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。它使用一至四字节为每个字符编码。
  3. GBXXX字符集:
      GB2312:简体中文码表。一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,这样大约可以组合了包含7000个简体汉字,此外数学符号、罗马希腊的字母、日文的假名等都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的“全角”字符,而原来在127号以下的那些就叫“半角”字符了。
      GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等。

2.3 字符串中的编码解码问题

  1. 编码:
      byte[] getBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
      byte[] getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
  2. 解码:
      String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新String
      String(byte[] byte,String charsetName):通过指定的字符集解码指定的字节数组来构造新的String
  3. 字符流中和编码解码问题相关的两个类:
      InputSreamReader
      OutputStreamWriter
  4. 和编码相关的构造方法:
      InputStreamReader(InputStream in String charSetName)
      OutputStreamWriter(OutputStream out,String charSetName)

2.4 字符流中的编码解码问题

  1. 字符流抽象基类
    Reader:
    字符输入流的基类
    Writer:
    字符输出流的抽象类
  2. 字符流中和编码解码问题相关的两个类:
    InputStreamReader
    OutputStreamWriter

2.5 字符流写数据的5中方式

void write(int c)
  写入一个字符
void write(char[] cbuf)
  写入一个字符数组
void write(char[] cbuf,int off,int len)
  写入字符数组的一部分
void write(String str)
  写一个字符串
void write(String str,int off,int len)
  写一个字符串的一部分

2.6 字符流读数据的2中方式

int read()
  一次读一个字符数据
int read(char[] cbuf)
  一次读一个字符数组数据

2.7 字符缓冲流

  1. 字符缓冲流
      BufferedWriter:将文本写入字符输出流、缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途
      BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。默认值足够大,可用于大多数用途。
  2. 构造方法:
      BufferedWriter(Writer out)
      BufferedReader(Reader in)

2.8 字符缓冲流特有功能

  1. BufferedWriter:
      void newLine():写一行分隔符,行分隔符字符串由系统属性定义
  2. BufferedReader:
      public String readLine():读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null

总结

没有总结,上面的内容就是总结。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值