文件追加:
FileOutputStream(File file,boolean append)
FileOutputStream(String path,boolean append)
如果第二个参数为true,则指定为追加模式.此时创建文件流时如果指定的
文件存在则内容会全部保留,新写入的内容会被追加到文件中
java将流分为两类 节点流与处理流:
节点流:
又称为低级流,特点:实际连接程序与另一端的"管道",负责实际读写数据的流.
IO一定是建立在某个低级流的基础上进行的.
文件流就是低级流,它们是实际连接程序与文件的管道,负责读写文件数据
处理流:
又称为高级流,特点:不能独立存在,必须连接在其他流上,目的是当数据经过该
流时对数据进行某种加工处理,简化我们的同等操作
实际开发中我们经常串联一组高级流最终到某个低级流上,是的读写数据的过程中
流水线式的操作对数据加工处理,这个过程也称为"流的连接" *
缓冲流(Bufferde)
java.io.BufferedInputStream和BufferedOutputStream
缓冲流是一对高级流,在流连接中的作用:保证读写效率
注意: 在结束执行之后只需要关闭高级流即可,关闭高级流时通常会关闭其连接的流
在程序中直接使用高级流的变量名调用方法即可
flush方法(清空缓存)
是在接口Flushable上定义的,
目的:强制将缓冲区中已经缓存的数据全部写出
而OutputStream实现了该接口,java中所有的输出流都有flush方法.
并非所有输出流的flush都有实质作用,而更多的是为了将flush动作传递下去,
最终传递给缓冲流来真正完成清空缓冲区操作.
对象流(Object)
java.io.ObjectOutputStream和ObjectInputStream
对象流是一对高级流,在流连接中的作用是进行对象的序列化与反序列化
对象序列化:将一个java对象转换为一组可以被保存或传输的字节的过程
对象输出流提供的方法: void writeObject(Object obj)
可以将给定对象进行序列化,前提,该对象所属的类必须实现接口: java.io.Serializable
否则序列化时会抛出异常:java.io.NotSerializableException
transient关键字(忽略执行)
被该关键字修饰的属性在进行对象序列化是会被忽略。
忽略不必要的属性可以达到对象序列化的"瘦身"
目的:减少不必要的开销 持久化时可以降低磁盘空间的开销,网络传输时可以提高传输速度
字节与字符流
java将流按照读写的数据单位划分为字节与字符流
java.io.InputStream和OutputStream是字节流的超类
java.io.Reader和Writer是字符流的超类
字符流
最小读写单位是一个char(字符)
都是高级流,本质上底层最后还是要读写字节,只不过字符与字节的转换由字符流完成
可以直接写出字符串
转换流
转换流是字符流常用的一对实现类
作用:衔接字节与其他字符流
将写出的字符按照指定的字符集转换为字节
他们在流链接中是重要的一环,但是实际开发中我们不会直接操作这对流 java.io.InputStreamReader和OutputStreamWriter
读:InputStreamReader
int read() 对于字符流而言,该方法用于读取1个字符,返回的int值对应的2进制 是"低16位有效",实际返回的就是一个char。 但是如果返回的int值为整数-1,依然表达流读取到了末尾
写:OutputStreamWriter
int write()
字符流可以直接写入字符串
作用:将写出的字符按照指定的字符集转换为字节
因此,构造器创建时除了指明链接在哪个流上之外,还可以明确字符集
意义:转换流是唯一一对可以链接在字节流上的字符流,这样以来其他的字符流就可以通过
链接转换流最终和字节流搭配使用
缓冲字符流、
java.io.BufferedWriter与BufferedReader
作用: 块写文本数据保证写出效率的(内部默认有一个长度8192的char数组)
BufferedReader提供的独有方法:
String readLine() 方法
String line = br.readLine();
作用:按行读取字符串
当第一次调用readLine()方法时,缓冲字符输入流会一次性读取8192个字符(块读)
并存入内部的char数组中,然后从数组一个字符开始直到找到换行符位置,然后将
之前的内容转换为一个字符串返回.(看起来像是读取了一行字符串)
当第二次调用readLine()则直接从上次遇到换行符的位置开始再继续寻找下一个
换行符为止,将之间的内容转换为一个字符串返回
如果流读取到了末尾,此时该方法会返回null
java.io.PrintWriter
作用:具有自动行刷新功能的缓冲字符输出流
其内部总是链接BufferedWriter作为缓冲功能
缓冲流以块读写形式保证读写效率,并且可以按行读写字符串
PrintWriter提供了直接对文件进行写操作的构造器
PrintWriter(File file)
PrintWriter(String path)
println方法
PrintWriter第一个参数是一个输出流时,就支持再传入一个boolean 类型的参数,
表示是否开启自动行刷新功能。
当自动行刷新功能开启后,每当我们调用println方法时就会自动flush
注:print方法并不会自动flush
PrintWriter pw = new PrintWriter(bw,true);//开启自动行刷新