[14]字节流

一.字节流

1.什么是字节流

  • 是IO流中的一种, 可以用来读写字节数据.

2.字节流和字符流的区别

  • 计算机中存储任何数据都是以字节的形式, 所以字节流可以读写任意类型的数据.

  • 在读写的数据是字符的时候, 用字符流更方便.

3.什么时候用字节流, 什么时候用字符流

  • 当从一个文本文件中读取数据, 在程序中当作字符使用时, 或者写出一段字符数据到文件中时, 使用字符流比较方便.

  • 字符流读取数据就是字符, 字符流可以直接写出字符

  • 如果只是读写数据, 不转为字符, 那么就都可以使用字节流.

4.read()方法为什么返回int

  • Reader.read() 读取一个字符, 返回int

  • InputStream.read() 读取一个字节, 返回int

  • 为什么不是返回char和byte呢?

  • Reader.read() 如果返回char, 那么无法表示流末尾, 因为所有的char都有可能在流中出现. 

  • 在read方法内部, 将读取到的char装入int, 这时正常数据不受影响, 强转回char之后直接使用, 也可以返回-1代表流末尾了.

  • InputStream.read() 如果返回byte, 也是无法表示流末尾的, 因为从-128到127中所有值都有可能在流中出现.

  • 在read方法内部, 是将读取到的字节&255, 正数没有任何变化, 负数转为了正数, 这时就可以用-1表示文件末尾了

  • 在真正使用数据时, 只要将转换后的数强转回byte即可

5.使用字节流拷贝文件

  • 使用FileInputStream和FileOutputStream, 逐个字节拷贝. 效率很低, 不推荐.

  • * 使用FileInputStream和FileOutputStream, 定义数组作为缓冲区, 一次读取一个数组, 一次写出一个数组, 提高效率.

  • * 使用BufferedInputStream和BufferedOutputStream, 逐个字节拷贝, 但其内部使用了缓冲机制, 速度较快.


二.转换流

* 1.InputStreamReader

  • 当获取了一个字节输入流, 希望从中读取字符数据时, 可以把字节输入流转为字符输入流InputStreamReader

  • 当读取非平台默认编码的字符文件时, FileReader做不到, 只能使用InputStreamReader.

* 2.OutputStreamWriter

  • 当获取了一个字节输出流, 希望向外写出字符数据时, 可以把字节输出流转为字符输出流OutputStreamWriter

  • 当写出非平台默认编码的字符文件时, FileWriter做不到, 只能使用OutputStreamWriter


三.标准输入输出流

1.System.in

  • 标准输入流, InputStream, 可以从键盘输入读取字节.

  • 可以使用System.setIn(InputStream)改变标准输入流的数据源.

2.System.out

  • 标准输出流, PrintStream, 可以向屏幕输出数据.

  • 可以使用System.setOut(PrintStream)改变标准输出流的数据目的地. 


四.练习

  • 1.对文件进行加密.

  • 2.读写UTF-8文件.

  • 3.从键盘输入读取学生考试成绩, 对其进行排序, 将结果输出到stu.txt文件中