------- android培训、java培训、期待与您交流! ----------
通过今天对java语言IO流的学习,我来给自己的学习内容做下简单直白的总结:
首先让我来总结下字节流特点:
它和字符流差不多,只是它操作的都是字节数据..(其实字符流操作的也是字节数据,但需要编码表)
我们如何使用字节流来进行文本数据的读取和写入呢?
我们知道字符流(FileReader类)可以读取单个字符或字符数组..
字节流(FileInputstream类)能读取单个字节或字节数组...但字节流有一个特有的方法available(),它能拿到文件的大小(也就是读到了多少个字节)...这样我们在定义数组进行读取的时候,就可以定义刚刚合适的数组长度了,不用在循环了(有局限性,建议文件不大的时候使用)
我们知道字符流(FileWriter类)可以写入单个字节,字符串以及字符数组..
而字节流(FileOutputStream类)只能写入单个字节和字节数组,是不能写字符串的(我们可以将字符串变成字节数组)
注意:字符流在写入字符的时候需要刷新操作,而字节流在没有使用缓冲区时是不需要的,会直接写入目的地了...
字节流不仅可以使用在文本数据的读取和写入上,也能对图片和媒体数据进行读取和写入:
对图片数据读取和写入:代码如图:
注意:字符流不能操作媒体图片数据,因为字符流读一段会去查表,如果没找到对应的数字,会不一样...
扩展:不仅仅可以使用缓冲区来加强字符流,还能使用缓冲区来加强字节流...(用法相同,只是字节流的缓冲区功能没有字符流缓冲区功能强大)
下面来总结下怎样使用字节流来读取键盘录入:
System.out:对应的是标准的输出设备(控制台)
System.in:对应的是标准的输入设备(键盘)
先用一段代码视图来演示下怎样读取键盘录入的:
总结到这里,我们来思考一下,以上是读一个打印一个的方式...我们能不能使用readLine方法来完成键盘录入一行数据的读取呢?
readLine方法是字符流缓冲区BufferedReader()中的方法..
而键盘录入是字节流InputStream类中的方法..
那么,我们能不能将字节流转换成字符流,在使用字符流缓冲区中的readLine方法呢?
下面,我就来总结下转换流:
字节流转换成字符流:IntputStreamReader(要接受指定的字节流)
字符流转换成字节流:OutputStreamWriter(要接受指定的字符流)
互相转换后,可以使用到缓冲区特有的功能:如图:
最后,我来总结下流的操作规律:通过3个明确来完成
1,先明确源和目的..
源:读取流(InputStream和Reader)
目的:写入流(OutputStream和Writer)
2,操作的数据是否是纯文本?
是:就字符流
不是:就字节流
3,当体系明确后,在明确要使用哪个具体的对象:
通过设备来进行区分:
源:内存,硬盘,键盘
目的:内存,硬盘,控制台
来个例子:比如讲一个文本文件的数据储存到另一个文件中(拷贝文件)
1,先明确源:因为是源,我们可以使用读取流(InputStream和Reader)
2,是不是纯文本:是纯文本,我们可以使用字符读取流(Reader)
这样体系就明确了...
3,明确下使用该体系中的哪个对象:
明确设备:硬盘(上的一个文件)
Reader体系中可以操作文件的对象:FlieReader类
注意:我们最后可以思考下,需不需要提高效率,需要的话就使用Reader体系中的缓冲区...
通过3个明确,我们就可以完成操作,目的也可以通过上面3步来明确....
扩展:转换流的由来就是因为它里面可以指定编码表,指定编码表只有转换流才能指定...