IO流
在Java语言中 ,输入和输出都被成为抽象的流,流的本质是数据传输
根据处理类型的不同可分为:每个抽象类都有很多的具体实现类
- 字节流(包含两个抽象类)
- InputStream输入流
- OutputStream输出流
- 字符流(包含两个抽象类)
- Reader(输入流)
- Writer(输出流)
字符流和字节流最主要的区别:字符流在处理输入输出时用到了缓存,而字节流不会用到缓存
字符流 = 字节流 + 编码表
InputStream
-
FileInputStream:读取文件的输入字节流
-
BufferedInputStream:缓冲输入字节流
该类内部就是维护一个8kb字节数组,目的是提高读取文件数据的效率
OutputStream
-
FileInputStream:向文件输出数据的输出字节流
-
BufferedInputStream:缓冲输出字节流
该类内部就是维护一个8kb字节数组,目的是提高向文件写数据的效率
Reader
-
FileReader:读取文件字符的输入字符流
-
BufferedReader:缓冲输入字符流
该类内部就是维护一个8192(2^13)个长度的字符数组并且扩展了功能( readLine()),目的是提高读取文件字符的效率
Writer
-
FileWriter:向文件输出数据的输出字符流
-
BufferedWriter:缓冲输出字符流
该类内部就是维护一个8192(2^13)个长度的字符数组并且扩展了功能( newLine()),目的是提高写文件字符的效率
注意
:字符流在写入的时候必须刷新缓冲区,目的是提交。 close()前会自动flush()
问:什么情况使用字节流?什么情况使用字符流?
读取到数据不需要经过编码或解码的情况下使用字节流(例如,图片数据)
如果读写的都是字符数据,就使用字符流
转换流
InputStreamReader:输入字节流的转换流(默认编码:GBK)
输入字节流转换为输入字符流
OutputStreamWriter:输出字节流的转换流(默认编码:GBK)
输出字节流转换为输出字符流
转换流的作用:
- 可以把对应的字节流转换成对应的字符流使用
- 可以指定码表进行读写文件的数据(常用utf-8)