对于数据的读写操作时,有不同的输入输出对象,Java中是将其当做流的形式来看待。
流(stream)的理解,Stream是从起源(source)到接收(sink)的有序数据
流的分类
数据的输入输出(数据的流向,以程序为中心看待)
按照操作数据的单位
字节流:每次读写数据是以一个字节为单位
字符流:每次读写数据是以一个字符(2个字节)为单位
节点流、处理流
节点流:就是直接建立的一种流,没有任何包装的
处理流:在节点流基础上进行包装后的流
字节流 输入:FileInputStream 输出:FileOutputStream
1 2 3 4 5 6 7 8 9 10 11 12 13 14 int read () 从该输入流读取一个字节的数据,返回-1 表示读完了。 int read (byte [] b) 从该输入流读取最多 b.length个字节的数据为字节数组,返回读取的字节个数,返回-1 表示读完了。 void write (byte [] b) 将 b.length个字节从指定的字节数组写入此文件输出流。 void write (byte [] b, int off, int len) 将 len字节从位于偏移量 off的指定字节数组写入此文件输出流。 void write (int b) 将指定的字节写入此文件输出流。 void close () 关闭此输入流并释放与流相关联的任何系统资源。
字符流 输入:FileReader 输出:FileWriter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 int read () 读一个字符,返回-1 表示读完了。 int read (char [] cbuf) 将字符读入数组,返回读取到的字符个数,返回-1 表示读完了。 close() 关闭流,先刷新。 flush() 刷新流。 void write (char [] cbuf) 写入一个字符数组。 void write (char [] cbuf, int off, int len) 写入字符数组的一部分。 void write (int c) 写一个字符 void write (String str) 写一个字符串
缓冲流 缓冲流:可以提高读写的效率 字节缓冲:BufferedInputStream、BufferedOutputStream 字符缓冲:BufferedReader、BufferedWriter
新增方法
1 2 String readLine(); 一次读一行(不包含换行符),返回读到的数据,读完了返回null。
转换流 转换流:可以将字节流转换成字符流 输入:InputStreamReader 输出:OutputStreamWriter
构造方法:
1 2 3 4 5 6 7 8 9 InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader。 InputStreamReader(InputStream in, Charset cs) 创建一个使用给定字符集的InputStreamReader。 OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter。 OutputStreamWriter(OutputStream out, Charset cs) 创建一个使用给定字符集的OutputStreamWriter。
打印流 打印流:(只有输出) 字节:PrintStream 字符:PrintWriter
对象流 对象流:可以将java对象进行读写操作,使用对象流可以将数据保存文件、数据库、写入网络在网络上传输 输入:ObjectInputStream 输出:ObjectOutputStream
1、需要类实现Serializable接口,表示当前类可序列化,序列化后对象才可进行读写操作
2、serialVersionUID
1 2 3 4 5 serialVersionUID:当前这个类进行序列化时的一个序列化版本编号(全局唯一) 可以解决一个版本兼容的问题:原先将一个对象存储后,在后面版本中类的结构有发生变化, 这个时候可以通过serialVersionUID进行识别,确保读取时还能够读出来 如果不加:那系统会自动生成一个,若后期类的结构又发生变化,那么又会重新生成,导致读取时两个serialVersionUID不一致,报错
3、序列化其他注意点:
transient:可以让属性值不被序列化
static:修饰的属性也不会序列化
随机访问流 随机访问流:(读写集合在一起,通过指定的模式来确定读写权限) RandomAccessFile
构造方法:
1 2 3 RandomAccessFile(File file, String mode)
方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 特殊的方法: long index = raf.getFilePointer();raf.seek(5 ); WriteXXX(),readXXX(),进行读写操作时,读写的数据的长度为当前数据类型的长度 例如: writeInt():写入数据将一次性写入4 个字节 readInt():读数据时一次性读4 个字节