一、缓冲流
作用:用来对原始流进行包装,以提高原始流读写数据的性能
(一)字节缓冲流:BufferedInputStream & BufferedOutputStream
作用以及原理:
提高字节流读写数据的性能。字节缓冲输入流自带了8KB缓冲池;字节缓冲输出流也自带了8KB缓冲池
public class Test3 {
public static void main(String[] args) throws Exception {
//ctrl+alt+t--选择8号
try( InputStream is = new FileInputStream("E:\\3. Studies\\xiaogou.png");
InputStream bis = new BufferedInputStream(is);//缓冲流。
OutputStream os = new FileOutputStream("D:\\Personal\\xiaogou.png");
OutputStream bos = new BufferedOutputStream(os);//缓冲池大小可变,直接(os*2)
//这里只能放置资源对象(流对象)
) {
byte[] buffer = new byte[1024];
int len;
while((len = bis.read(buffer))!= -1){
bos.write(buffer,0,len);
}
System.out.println("复制完成");
} catch (IOException e) {
e.printStackTrace();
}
}
}
(二)字符缓冲流 BufferedReader & BufferedWriter
作用以及原理:
自带8K(8192)的字符缓冲池,可以提高字符输入输出流读写字符数据的性能
public class Test5 {
public static void main(String[] args) {
try (
Reader fr = new FileReader("E:\\IDEA\\JavaCodeAll\\file-io-test\\src\\Test04.txt");
BufferedReader br = new BufferedReader(fr);
//创建字符缓冲输入流包装原始字符输入流
){
String line;
while ((line = br.readLine())!=null){
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、转换流
(一)不同编码读取时会乱码
如果代码的编码和读取的文件的编码是一致的,就不会乱码,但是要是不一致,那就乱码无疑。
(二)字符输入转换流 InputStreamReader
作用:解决不同编码时,字符流读取文本内容乱码的问题
解决思路:先获取文件的原始字节流,再将其真实的字符集编码转成字符输入流,这样字符输入流中的字就不乱码了。
(三)字符输出转换流 OutputStreamWriter
作用:控制写出去的字符使用什么字符集编码
解决思路:获取字节输出流,再按照指定的字符集编码将其转换成字符输出流,以后写出去的字符就会用该字符集编码了。
三、打印流 PrintStream & PrintWriter
作用:打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去。
(一)PrintStream提供的打印数据的方案
(二)PrintWriter提供的打印数据的方案
PrintWriter可以写字符,而PrintStream是用来写字节的,所以大部分功能都是一样的。
(三)打印流的应用:输出语句的重定向
作用:可以把输出语句的打印位置改到某个文件中去。
四、数据流 DataInputStream & DataOutputStream
(一)DataOutputStream 数据输出流
作用:允许把数据和类型一并写出去
(二)DataInputStream 数据输入流
作用:用于读取数据输出流写出去的数据,读取的时候要按照类型的顺序读取
五、序列化流 ObjectInputStream&ObjectOutputStream
对象序列化:把Java对象写入到文件中去
对象反序列化:把文件中的Java对象读出来
(一)ObjectOutputStream 对象字节输出流
作用:可以把Java对象进行序列化,把Java对象存入到文件中去
注意:对象如果需要序列化,必须需要实现序列化接口:类名 implements Serializable
(二)ObjectInputStream 对象字节输入流
作用:可以把Java对象进行反序列化,把存储在文件中的Java对象读入到内存中来。
保护隐私信息的手段:
一次性序列化多个对象方法:
用ArrayList集合存储多个对象,然后直接对集合进行序列化即可。
注意:ArrayList集合已经实现了序列化接口了。
六、补充知识:IO框架
(一)什么是框架
解决某类问题,编写一套类、接口等,可以理解成一个半成品,大多框架都是第三方研发的。
好处:在框架的基础上开发,可以得到优秀的框架软件结构,并能提高开发效率。
框架的形式:一般把类、接口等编译成class形式,再压缩成一个.jar结尾的文件发行出去。
(二)什么是IO框架
封装了Java提供的对文件、数据进行操作的代码,对外提供了更简单的方式来对文件进行操作,对数据进行读写等。