I/O流:可以类比管道,流动的是字节。
FileInputStream和FileOutputStream是低级流,数据源是明确的。
缓冲字节输入输出流BIS/BOS
1)BufferedInputStream:缓冲字节输入流
2)BufferedOutputStream:缓冲字节输出流
3)他们内部维护者一个缓冲区,可以提高读写效率。是基于低级流的高级流。
4)缓冲字节输入输出流是高级流,不能独立存在,必须依靠于低级流。
BufferedInputStream
1)创建时需要传入一个流对象,Buffered流实际上就是基于传入的流进行性能优化或功能拓展。
2)在读取文件时,BufferedInputStream是一次性读取一块数据缓存在内存中,在调用时它就从自己的缓存区中给出数据。
BufferedInputStream和FileinputStreram的区别
BufferedInputStream是一次性读取一块数据缓存在内存中,在调用时它就从自己的缓存区中给出数据。
FileInputStream是每次从磁盘上读取一个字节数据到内存,调用它时它只能提供这个字节
因此在程序中调用单字节读取方法时,BufferedInputStream就是从缓存区中给出数据,明显快于FileInputStream
BufferedOutputStream和BufferedInputStream实现机制类似,此处不再赘述。
1)BufferedInputStream:缓冲字节输入流
2)BufferedOutputStream:缓冲字节输出流
3)他们内部维护者一个缓冲区,可以提高读写效率。是基于低级流的高级流。
4)缓冲字节输入输出流是高级流,不能独立存在,必须依靠于低级流。
BufferedInputStream
1)创建时需要传入一个流对象,Buffered流实际上就是基于传入的流进行性能优化或功能拓展。
2)在读取文件时,BufferedInputStream是一次性读取一块数据缓存在内存中,在调用时它就从自己的缓存区中给出数据。
BufferedInputStream和FileinputStreram的区别
BufferedInputStream是一次性读取一块数据缓存在内存中,在调用时它就从自己的缓存区中给出数据。
FileInputStream是每次从磁盘上读取一个字节数据到内存,调用它时它只能提供这个字节
因此在程序中调用单字节读取方法时,BufferedInputStream就是从缓存区中给出数据,明显快于FileInputStream
BufferedOutputStream和BufferedInputStream实现机制类似,此处不再赘述。
数据输入输出流DIS/DOS
1)DataInputStream:可以直接读取基本类型数据的流
2)DataOutputStream:可以直接写基本数据的流
他们简化了对基本数据类型的读写操作。
3)是高级流,构造时需要传入一个流,可以嵌套流
DataInputStream
常用方法:
int readInt(); double readDouble(); long readLong(); ...
String readUTF();
DataOutputStream
常用方法:
writeInt(int i); writeLong(long l); writeUTF(String str);
1)DataInputStream:可以直接读取基本类型数据的流
2)DataOutputStream:可以直接写基本数据的流
他们简化了对基本数据类型的读写操作。
3)是高级流,构造时需要传入一个流,可以嵌套流
DataInputStream
常用方法:
int readInt(); double readDouble(); long readLong(); ...
String readUTF();
DataOutputStream
常用方法:
writeInt(int i); writeLong(long l); writeUTF(String str);
字符流:
以字符为单位读写数据,一次出一个字符(unicode),即一个char。可以以指定字符编码集进行写。
字符流底层还是基于字节流形式读写的。
所有的字符流都是高级流。
InputStreamReader:字符输入流
1)构造方法
InputStreamReader(InputStream in) 以系统的编码集进行输入
InputStreamReader(InputStream in,
String charsetName) 以指定的编码集进行输入
2)读只能一个一个字符地读取。
OutputStreamWriter:字符输出流,先将字符按照编码集转换成字节,再写入文件
1)构造方法:
OutputStreamWriter(OutputStream out) 以系统的编码集进行输出
OutputStreamWriter(OutputStream out,
String charsetName) 以指定的编码集进行输出
2)可以一次写入一个字符串,这是与该流的读取流不一样的。
缓冲字符输入流和缓冲字符输出流:以行或字符串为单位读写数据
BufferedReader:缓冲字符输入流
1)构造方法:
要求传入构造方法的是一个字符流,不能是字节流
2)reader可以使用readLine()方法读取一行数据。
BufferedWriter:缓冲字符输出流,可以将一个字符串转换成一个一个字符,但是不能转换为字节
1)构造方法
要求传入构造方法的是一个字符流,而不能是字节流。
2)要求按照指定的编码集进行读写时,应该在创建字符流时指定编码集,因为编码是在字符转换成字节时进行的。
3)Writer可以写入一个字符串,也可以通过writeLine()方法写字符
对于readLine(),若返回数据为null,则标明已经读到了文件末尾。若某行内容为空,读取回来的字符串是不为空的,但是
字符串长度为0.
文本文件输入输出流:用于读写文本文件的字符输入流和输出流。读取单位也是字符
FileReader
1)构造方法
类似FileWriter
2)FileReader的效果等效于 FileInputStream+InputStreaReader
因此,也不支持一次读一个字符串,只能一次读取一个字符
FileWriter
1)构造方法
FileWriter(File file)
FileWriter(String filepath)
这两个够构造方法的参数跟FileOutputStream的参数意义是一样的。可以直接套在文件上。
2)FileWriter的效果等效于 FileOutputStream+OutputStreamReader
FileReader
1)构造方法
类似FileWriter
2)FileReader的效果等效于 FileInputStream+InputStreaReader
因此,也不支持一次读一个字符串,只能一次读取一个字符
FileWriter
1)构造方法
FileWriter(File file)
FileWriter(String filepath)
这两个够构造方法的参数跟FileOutputStream的参数意义是一样的。可以直接套在文件上。
2)FileWriter的效果等效于 FileOutputStream+OutputStreamReader
字符输出流(没有输入,只有输出)
PrintWriter
可以理解为另一种缓冲字符输出流,其内部也维护了一个缓冲区
应用场景:servlet(运行在服务器端的小程序)。给客户端发送相应使用的输出流就是PrintWriter
1)构造方法:
PrintWriter(File file): 以行为单位向文件写数据
PrintWriter(OutputStream out):以行为单位向字节输出流写数据
PrintWriter(Writer writer):以行为单位向字符输出流写数据
PrintWriter(String fileName):以行为单位向指定路径的文件写数据
2)写方法:
PrintWriter有非常丰富的写方法,但是其写方法是print开头的。
PrintWriter
可以理解为另一种缓冲字符输出流,其内部也维护了一个缓冲区
应用场景:servlet(运行在服务器端的小程序)。给客户端发送相应使用的输出流就是PrintWriter
1)构造方法:
PrintWriter(File file): 以行为单位向文件写数据
PrintWriter(OutputStream out):以行为单位向字节输出流写数据
PrintWriter(Writer writer):以行为单位向字符输出流写数据
PrintWriter(String fileName):以行为单位向指定路径的文件写数据
2)写方法:
PrintWriter有非常丰富的写方法,但是其写方法是print开头的。
其他方面的知识:
1)try-catch执行时,catch语句块中的throw关键字执行之后就会退出try语句,因此在throw后面的内容就不会执行。
2)辨别高级流的简单方法:
看构造方法,若构造方法要求传入另一个流,那么这个流就是高级流。
3)ctrl+shift+O:自动导包,自动将多余的包删除
4)高级流可以嵌套使用,但是最终还是会包含一个低级流。
5)所有的输出流在使用完毕之后都要调用flush()方法。flush的作用是将缓冲区中未写出的数据一次性写出。
为什么呢?
输出流在调用写方法时,缓冲区不一定会去执行从内存到磁盘的写操作,输出流的工作机制是,当缓冲区数据写满之后会自动
传到磁盘,但是当写到最后几个数据时,缓冲区没满但是写操作已经结束,缓冲区不会自动将尚未满的数据写入磁盘,此时需要我们
手动调flush()方法,将最后没有装满的缓冲区的数据全都写入磁盘,否则最后的几个字节就会消失。
6)在使用高级流时,使用完毕后我们只需要关闭最外层的高级流,高级流中包含的流会自动关闭。第三方的流除外。
7)这里注意一点,不能自己写一个文件然后调用DataOutputStream的readUTF方法,因为我们自己写的文件的编码方式可能
跟writeUTF方法写的格式不一致,会导致出错。
8)流关闭之后,不能再通过被关闭的流读写数据
9)流的读取,一般都只能按照流的最小单位来读取,比如FileInputStream只能支持字节读取,InputStreamReader只能
支持字符读取,BufferedReader可以支持字符串读取
10)文本文件的特殊性:
文本文件的基础单位是字符,而一般文件的基础单位为字节,比如txt文件是以字符为单位的,但是.zip文件是以字节为单位
的
1)try-catch执行时,catch语句块中的throw关键字执行之后就会退出try语句,因此在throw后面的内容就不会执行。
2)辨别高级流的简单方法:
看构造方法,若构造方法要求传入另一个流,那么这个流就是高级流。
3)ctrl+shift+O:自动导包,自动将多余的包删除
4)高级流可以嵌套使用,但是最终还是会包含一个低级流。
5)所有的输出流在使用完毕之后都要调用flush()方法。flush的作用是将缓冲区中未写出的数据一次性写出。
为什么呢?
输出流在调用写方法时,缓冲区不一定会去执行从内存到磁盘的写操作,输出流的工作机制是,当缓冲区数据写满之后会自动
传到磁盘,但是当写到最后几个数据时,缓冲区没满但是写操作已经结束,缓冲区不会自动将尚未满的数据写入磁盘,此时需要我们
手动调flush()方法,将最后没有装满的缓冲区的数据全都写入磁盘,否则最后的几个字节就会消失。
6)在使用高级流时,使用完毕后我们只需要关闭最外层的高级流,高级流中包含的流会自动关闭。第三方的流除外。
7)这里注意一点,不能自己写一个文件然后调用DataOutputStream的readUTF方法,因为我们自己写的文件的编码方式可能
跟writeUTF方法写的格式不一致,会导致出错。
8)流关闭之后,不能再通过被关闭的流读写数据
9)流的读取,一般都只能按照流的最小单位来读取,比如FileInputStream只能支持字节读取,InputStreamReader只能
支持字符读取,BufferedReader可以支持字符串读取
10)文本文件的特殊性:
文本文件的基础单位是字符,而一般文件的基础单位为字节,比如txt文件是以字符为单位的,但是.zip文件是以字节为单位
的