先做一个简单整理: 字节流和字符流:这里主要是针对文件操作的IO流来写的,只适合少量、小文件的读写。不适合大量、很多文件的读写,速度会非常慢。 字节流:FileInputStream(读), FileOutputStream(写) 字符流:FileReader(读), FileWriter(写) 缓冲流:为解决大量、多文件读取而存在,嵌套在字节流、字符流的外面,大大增强读写速度。 字节缓冲流:BufferedInputStream(读), BufferedOutputStream(写) 字符缓冲流:BufferedReader(读), BufferedWriter(写) 格式:字节缓冲流(字节流), 字符缓冲流(字符流)如下 BufferedInputStreambis = new BufferedInputStream(new FileInputStream(File f)) BufferedReaderbr = new BufferedReader(new FileReader(File f)) 转换流:解决编码不同引出的读写问题,嵌套在字节流的外面,可指定编码方式进行读写(注:读写的编码方式要相同) InputStreamReader:字节流通向字符流的桥梁,作用是读取字节,转换成字符 OutputStreamWriter:字符流通向字节流的桥梁,作用是将字符转换成字节写入 格式:跟上面的类似,就不敲了 那么重点来了,缓冲流能和转换流进行嵌套,再套上字符或字节流吗? 如果要对大量编码方式进行转换的文件进行读写,那是不是应该套上缓冲流来增强读写速度啦? 经试验,的确可行,格式如下: 字符缓冲流(转换流(字节流(文件))) 图示为GBK格式文件的读写, 这里需要注意一点,因为转换流只有两种InputStreamReader和OutputStreamWriter, InputStreamReader读取字节,转换成字符,所以它能操作的只能是字节流InputStream,而操作它的只能是BufferedReader,不能用BufferedInputStream OutputStreamWriter将字符转换成字节写入,所以操作它的只能是BufferedWriter,它操作的只能是字节流OutputStream,不能用BufferedOutputStream 还有个序列化(ObjectOutputStream)和反序列化流(ObjectInputStream),不过仔细想想,他俩操作的都是字节流,那么字符缓冲流就不适合这哥俩了,笔者好奇试了试字节缓冲流,居然是OK的,这里也贴出个格式图片: 字节缓冲流(序列化流(字节流(文件))) 那么问题又来了,能不能有这种格式啦: 字符缓冲流(转换流(序列化流(字节流(文件))))? 我又经不住诱惑,丧心病狂的测试了,果然有 BufferedReader brr = new BufferedReader(new InputStreamReader(new ObjectInputStream(new FileInputStream(file)),"GBK")); 从此以后,妈妈再也不用担心我傻傻分不清各种IO流了
|