一、什么是流?什么是输入输出流?
流是个抽象的概念,是对输入输出设备的抽象,输入流可以看作一个输入通道,外部传入数据给程序需要借助输入流;输出流可以看作一个输出通道,程序把数据传输到外部需要借助输出流。
二、什么是字节流和字符流?
1、字节流:'传输数据的最基本单位是字节'的流。字节流的类通常以stream结尾.字节流分为字节输入流和字节输出流:
字节输入流:常用的有:
a、InputStream:是字节输入流的抽象基类,不能创建对象,但是可以用来“接口化编程”,定义了几个基本函数:
1)read(byte[] b):从流中读取b的长度个字节的数据存储到b中,返回结果是读取的字节个数(当再次读时,如果返回-1说明到了结尾,没有了数据)
2)read(byte[] b, int off, int len):从流中从off的位置开始读取len个字节的数据存储到b中,返回结果是实际读取到的字节个数(当再次读时,如果返回-1说明到了结尾,没有了数据)。
3)close():关闭流,释放系统资源
b、FileInputStream:主要用来操作文件输入流,是用来读文件数据的流,所以它需要一个文件对象用来实例化。它除了可以使用基类定义的函数外,它还实现了基类的read()函数(无参的):
1)read():从流中读取1个字节的数据,返回结果是一个int。
c、BufferedInputStream(FileInputStream的子类,不是InputStream的直接实现子类) :这是一种封装别的流以提高效率的流,所以它的初始化需要一个的InputStream流对象。已经提前将数据封装到内存中,内存中操作数据要快,所以它的效率要要非缓冲的要高。跟FileInputStream一样,实现了基类的read()。
字节输出流:常用的有:
a、OutputStream:是字节输出流的基类, OutputStream作为基类,给它的基类定义了几个通用的函数:
1)write(byte[] b):将b的长度个字节数据写到输出流中。
2)write(byte[] b,int off,int len):从b的off位置开始,获取len个字节数据,写到输出流中。
3)flush():刷新输出流,把数据马上写到输出流中。
4)close():关闭流,释放系统资源
b、FileOutputStream:是用于写文件的输出流,它除了可以使用基类定义的函数外,还实现了OutputStream的抽象函数write(int b):
1)write(int b):将b转成一个字节数据,写到输出流中。
c、BufferedOutputStream:实现了OutputStream的抽象函数write(int b):
1)write(int b):将b转成一个字节数据,写到输出流中。
2、字符流:字符流的类通常以reader和writer结尾。字符流也分为字符输出流和字符输入流。
字符输入流:
1)Reader是字符输入流的抽象基类 ,它定义了以下几个函数:
a、read() :读取单个字符,返回结果是一个int,需要转成char;到达流的末尾时,返回-1
b、read(char[] cbuf):读取cbuf的长度个字符到cbuf这种,返回结果是读取的字符数,到达流的末尾时,返回-1
c、close() :关闭流,释放占用的系统资源。
2)InputStreamReader 可以把InputStream中的字节数据流根据字符编码方式转成字符数据流。它除了可以使用基类定义的函数,它自己还实现了以下函数:
a、read(char[] cbuf, int offset, int length) :从offset位置开始,读取length个字符到cbuf中,返回结果是实际读取的字符数,到达流的末尾时,返回-1
3)FileReader 可以把FileInputStream中的字节数据转成根据字符编码方式转成字符数据流。
4)BufferedReader可以把字符输入流进行封装,将数据进行缓冲,提高读取效率。它除了可以使用基类定义的函数,它自己还实现了以下函数:
a、read(char[] cbuf, int offset, int length) :从offset位置开始,读取length个字符到cbuf中,返回结果是实际读取的字符数,到达流的末尾时,返回-1
b、readLine() :读取一个文本行,以行结束符作为末尾,返回结果是读取的字符串。如果已到达流末尾,则返回 null
字符输出流:
1)Writer是字符输出流的抽象基类, ,它定义了以下几个函数:
a、writer(char[] cbuf) :往输出流写入一个字符数组。
b、writer(int c) :往输出流写入一个字符。
c、writer(String str) :往输出流写入一串字符串。
d、writer(String str, int off, int len) :往输出流写入字符串的一部分。
e、close() :关闭流,释放资源。 【抽象方法】
f、flush():刷新输出流,把数据马上写到输出流中。【抽象方法】
2)OutputStreamWriter可以使我们直接往流中写字符串数据,它里面会帮我们根据字符编码方式来把字符数据转成字节数据再写给输出流。
3)FileWriter与OutputStreamWriter功能类似,我们可以直接往流中写字符串数据,FileWriter内部会根据字符编码方式来把字符数据转成字节数据再写给输出流。
4)BufferedWriter比FileWriter还高级一点,它利用了缓冲区来提高写的效率。它还多出了一个函数:
newLine():写入一个换行符
三、关于字节流和字符流的一点总结:
1)字节流转换成字符流,实际上就是byte[]转化为String;字符流转换成字节流,实际上就是String转化为byte[]。
2)stream结尾的都是字节流,reader和writer结尾都是字符流。
a、InputStreamReader 是字节流通向字符流的桥梁,它将字节流转换为字符流.处理的其实是字节流。(可以处理Unicode)
b、OutputStreamWriter是字符流通向字节流的桥梁,它将字符流转换为字节流。处理的其实是字符流
3)字符流是字节流根据字节流所要求的编码集解析获得的,可以理解为:字符流=字节流+编码集。
4)字节流和字符流的区别:字节流和字符流的主要区别就是他们的处理方式。
5)字符流和字节流每次读入的字节数是不确定的,可能相同也可能不相同,所以说读入的字节数不是两者的区别。