缓冲流Buffered:缓冲流是一种高级的流,他可以对file类的流进行包装,内部含有一种缓冲池,可以在一定程度上提高IO的读写效率
不过,按实验来看,只要给低级流和缓冲流相似的byte读写,其实两者的性能是差不多的。但是默认情况下缓存流具有8kb的缓冲池,而低级流没有。
下面是缓冲流的基本定义方法,这些流的使用方法和低级流方法差距不大,故不特意提及
InputStream is = new FileInputStream("io-app2/src/itheima01.txt"); // 1、定义一个字节缓冲输入流包装原始的字节输入流 InputStream bis = new BufferedInputStream(is); OutputStream os = new FileOutputStream("io-app2/src/itheima01_bak.txt"); // 2、定义一个字节缓冲输出流包装原始的字节输出流 OutputStream bos = new BufferedOutputStream(os);
转换流InputStream:当你编码程序读取文件出现乱码才会用到这个流,这两个流都是不能独立使用的,都需要封装一个子对象inputstream/outputstream,再指定一个编码表,默认使用utf-8
// 1、创建一个文件字节输出流 OutputStream os = new FileOutputStream("io-app2/src/itheima07out.txt"); // 2、把原始的字节输出流,按照指定的字符集编码转换成字符输出转换流。 Writer osw = new OutputStreamWriter(os, "GBK"); // 3、把字符输出流包装成缓冲字符输出流 BufferedWriter bw = new BufferedWriter(osw);
打印流PrintStream/PrintWriter:这个可以做日志用,修改系统底层的打印流,将想在cmd中输出的东西输出在文本文件中
try ( PrintStream ps = new PrintStream("io-app2/src/itheima09.txt"); ){ // 把系统默认的打印流对象改成自己设置的打印流 System.setOut(ps); System.out.println("烈士暮年"); System.out.println("壮心不已"); } catch (Exception e) { e.printStackTrace(); }
数据流Data/序列化流Object:数据流就是写特定的数据,我感觉没啥用
序列化流可以把类封装再写到文件中,不过类要提前序列化,要求是implements Serializable
序列化:如何让部分信息不进行序列化?(比如密码等敏感信息)这时需要在类中给其加上transient
例如:private transient String passWord;这里我想起来mybatis里的不被MySQL读取和这个用的差不多,不过那个是注解@transient :transient短暂的;过客
try ( // 1、创建一个对象字节输入流管道,包装 低级的字节输入流与源文件接通 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("io-app2/src/itheima11out.txt")); ){ User u = (User) ois.readObject(); System.out.println(u); } catch (Exception e) { e.printStackTrace(); }
反序列化:
try ( // 2、创建一个对象字节输出流包装原始的字节 输出流。 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("io-app2/src/itheima11out.txt")); ){ // 1、创建一个Java对象。 User u = new User("admin", "张三", 32, "666888xyz"); // 3、序列化对象到文件中去 oos.writeObject(u); System.out.println("序列化对象成功!!"); } catch (Exception e) { e.printStackTrace(); }