IO流
1.流的分类:
依照数据流向的不同:输入流 输出流
依照处理数据的单位的不同:字节流(处理二进制文件) 字符流(处理的文本文件)
依照角色的不同:节点流(直接作用于文件的) 处理流(作用于节点流或处理流)
2.IO的体系
抽象基类 >>节点流(文件流) >> 缓冲流(处理流的一种)
InputStream >> FileInputStream >> BufferedInputStream
OutputStream >> FileOutputStream >> BufferedOutputStream
Reader >> FileReader >> BufferedReader
Writer >> FileWriter >> BufferedWriter
3.经常用法
①。
FileInputStream
public int read():读取一个字节,如没有则返回-1
public int read(byte[] b):读取一个字节数组,如没有返回-1(经常使用byte[1024])
public int read(byte[] b, int off, int len):读取指定长度的字节数组。如没有返回-1
public void close():关闭字节流
②。
FileOutputStream
public void write(int b):写入一个字节
public void write(byte[] b):写入一个字节数组
public void write(byte[] b,int off, int len):写入指定长度是字节数组(经常使用)
public void close():关闭输出流
③。
FileReader
public int read():读取一个字符,如没有则返回-1
public int read(char[] c):读取一个字符数组,如没有返回-1(经常使用byte[1024])
public int read(char[] c, int off, int len):读取指定长度的字符数组,如没有返回-1
public void close():关闭字符流
④。FileWriter
public void write(int c):写入一个字符
public void write(byte[] c):写入一个字符数组
public void write(byte[] c,int off, int len):写入指定长度是字符数组(经常使用)
public void close():关闭输出流
⑤。BufferedInputStream
public int read():读取一个字节,如没有则返回-1
public int read(byte[] b):读取一个字节数组,如没有返回-1(经常使用byte[1024])
public int read(byte[] b, int off, int len):读取指定长度的字节数组,如没有返回-1
public void close():关闭输入缓冲流,也会把字节流关闭
⑥。
BufferedOutputStream
public void write(int b):写入一个字节
public void write(byte[] b):写入一个字节数组
public void write(byte[] b,int off, int len):写入指定长度是字节数组(经常使用)
public void close():关闭输出缓冲流。也会把字节流关闭
⑦。BufferedReader
public int read():读取一个字符。如没有则返回-1
public int read(char[] c):读取一个字符数组,如没有返回-1(经常使用byte[1024])
public int read(char[] c, int off, int len):读取指定长度的字符数组,如没有返回-1
public String readLine():读入一行数据,返回一个字符串。如没有数据。则返回null
public void close():关闭输入缓冲流,也会把字节流关闭
⑧。
BufferedWriter
public void write(int c):写入一个字符
public void write(byte[] c):写入一个字符数组
public void write(byte[] c,int off, int len):写入指定长度是字符数组(经常使用)
public void write(String s, int off, int len):写入指定长度是字符数组(经常使用)
public void close():关闭输出缓冲流,也会把字节流关闭
public void flush():刷新输出缓冲流
public void newLine():换行
4.其它流
①。转换流:实现字节流与字符流之间的转换
InputStreamReader:解码:字节数组--->字符串
OutputStreamWriter:解码:字节数组--->字符串
②。
标准的输入输出流:
标准的输出流:System.out:默认输出到控制台
标准的输入流:System.in:从键盘读取输入数据
③。打印流
字节流:PrintStream
字符流:PrintWriter
④。
数据流:用来处理基本数据类型、String、字节数组的数据:
DataInputStream
DataOutputStream
用数据流写入的数据。应该用数据流读出,否则可能出现乱码
5.对象流
ObjectInputStream和ObjectOutputSteam
用于存储和读取对象的处理流。
它的强大之处就是能够把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
序列化(Serialize):用ObjectOutputStream类将一个Java对象写入IO流中
反序列化(Deserialize):用ObjectInputStream类从IO流中恢复该Java对象
ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
①。
对象序列化机制
同意把内存中的Java对象转换成平台无关的二进制流,从而同意把这样的二进制流持久地保存在磁盘上。或通过网络将这样的二进制流传输到还有一个网络节点。
当其他程序获取了这样的二进制流,就能够恢复成原来的Java对象
序列化的优点在于可将不论什么实现了Serializable接口的对象转化为字节数据,使其在保存和传输时可被还原
序列化是 RMI(Remote Method Invoke – 远程方法调用)过程的參数和返回值都必须实现的机制,而 RMI 是 JavaEE 的基础。因此序列化机制是 JavaEE 平台的基础
假设须要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现例如以下两个接口之中的一个:Serializable或Externalizable
②。
凡是实现Serializable接口的类都有一个表示序列化版本号标识符的静态变量:
private static final long serialVersionUID;
serialVersionUID用来表明类的不同版本号间的兼容性
假设类没有显示定义这个静态变量,它的值是Java执行时环境依据类的内部细节自己主动生成的。
若类的源码作了改动,serialVersionUID 可能发生变化。
故建议。显示声明
显示定义serialVersionUID的用途
希望类的不同版本号对序列化兼容,因此需确保类的不同版本号具有同样的serialVersionUID
不希望类的不同版本号对序列化兼容,因此需确保类的不同版本号具有不同的serialVersionUID
③。
若某个类实现了 Serializable 接口,该类的对象就是可序列化的:
创建一个 ObjectOutputStream
调用 ObjectOutputStream 对象的 writeObject(对象) 方法输出可序列化对象。注意写出一次。操作flush()
反序列化
创建一个 ObjectInputStream
调用 readObject() 方法读取流中的对象
强调:假设某个类的字段不是基本数据类型或 String 类型。而是还有一个引用类型。那么这个引用类型必须是可序列化的,否则拥有该类型的 Field 的类也不能序列化
6.RandomAccessFile 类支持 “随机訪问” 的方式,程序能够直接跳到文件的随意地方来读、写文件
支持仅仅訪问文件的部分内容
能够向已存在的文件后追加内容
①。
RandomAccessFile 对象包括一个记录指针。用以标示当前读写处的位置。RandomAccessFile 类对象能够自由移动记录指针:
long getFilePointer():获取文件记录指针的当前位置
void seek(long pos):将文件记录指针定位到 pos 位置
②。
构造器
public RandomAccessFile(File file, String mode)
public RandomAccessFile(String name, String mode)
创建 RandomAccessFile 类实例须要指定一个 mode 參数。该參数指定 RandomAccessFile 的訪问模式:
r: 以仅仅读方式打开
rw:打开以便读取和写入
rwd:打开以便读取和写入;同步文件内容的更新
rws:打开以便读取和写入;同步文件内容和元数据的更新