天天看点

黑马程序员-day20字节流及字节流缓冲区

1.字节流

字节流:InputStream  OutputStream

字节流不需要刷新流对象的,特有方法:byte[] buf = new byte[fis.available()];//定义一个刚刚好的缓冲区。不用在循环了。

2.字节流练习:

(1)复制一个图片

思路:

1,用字节读取流对象和图片关联。

2,用字节写入流对象创建一个图片文件。用于存储获取到的图片数据。

3,通过循环读写,完成数据的存储。

4,关闭资源。

代码图例:

黑马程序员-day20字节流及字节流缓冲区
黑马程序员-day20字节流及字节流缓冲区

(2)复制Mp3

自定义一个字节流缓冲区,模拟read和close方法。

代码图例:

黑马程序员-day20字节流及字节流缓冲区
黑马程序员-day20字节流及字节流缓冲区

结论:

字节流的读一个字节的read方法为什么返回值类型不是byte,而是int。因为有可能会读到连续8个二进制1的情况,8个二进制1对应的十进制是-1.那么就会数据还没有读完,就结束的情况。因为我们判断读取结束是通过结尾标记-1来确定的。所以,为了避免这种情况将读到的字节进行int类型的提升。并在保留原字节数据的情况前面了补了24个0,变成了int类型的数值。而在写入数据时,只写该int类型数据的最低8位。

3.转换流

InputStreamReader和OutputStreamWriter:FileReader和FileWriter是转换流的子类,它们有默认的字符编码集。

转换流可以指定编码表。

4.流操作规律:

1,

源:键盘录入。

目的:控制台。

2,需求:想把键盘录入的数据存储到一个文件中。

源:键盘。

目的:文件。

3,需求:想要将一个文件的数据打印在控制台上。

源:文件。

目的:控制台。

流操作的基本规律:

最痛苦的就是流对象有很多,不知道该用哪一个。

通过三个明确来完成。

1,明确源和目的。

源:输入流。InputStream  Reader

目的:输出流。OutputStream  Writer。

2,操作的数据是否是纯文本。

是:字符流。

不是:字节流。

例如:

需求:将键盘录入的数据保存到一个文件中。这个需求中有源和目的都存在。那么分别分析。源:InputStream Reader是不是纯文本?是!Reader。设备:键盘。对应的对象是System.in.

不是选择Reader吗?System.in对应的不是字节流吗?

为了操作键盘的文本数据方便。转成字符流按照字符串操作是最方便的。所以既然明确了Reader,那么就将System.in转换成Reader。用了Reader体系中转换流,InputStreamReader。:InputStreamReader isr = new InputStreamReader(System.in);

需要提高效率吗?需要!BufferedReader

BufferedReader bufr = new BufferedReader(isr);

目的:OutputStream  Writer是否是存文本?是!Writer。

设备:硬盘。一个文件。使用 FileWriter。

FileWriter fw = new FileWriter("c.txt");

需要提高效率吗?需要。BufferedWriter bufw = new BufferedWriter(fw);

**************

扩展一下,想要把录入的数据按照指定的编码表(utf-8),将数据存到文件中。

目的:OutputStream  Writer。是否是存文本?是!Writer。

设备:硬盘。一个文件。使用 FileWriter。但是FileWriter是使用的默认编码表。GBK.

但是存储时,需要加入指定编码表utf-8。而指定的编码表只有转换流可以指定。所以要使用的对象是OutputStreamWriter。而该转换流对象要接收一个字节输出流。而且还可以操作的文件的字节输出流。FileOutputStream

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");

需要高效吗?需要。

BufferedWriter bufw = new BufferedWriter(osw);

所以,记住。转换流什么使用。字符和字节之间的桥梁,通常,涉及到字符编码转换时,

需要用到转换流。

3,当体系明确后,在明确要使用哪个具体的对象。

通过设备来进行区分:

源设备:内存,硬盘。键盘

目的设备:内存,硬盘,控制台。

4.System和Properties

练习:打印日志异常信息到硬盘

参考代码:day19\ExceptionInfo.java

练习:打印系统信息到硬盘

图例代码:

黑马程序员-day20字节流及字节流缓冲区