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:打开以便读取和写入;同步文件内容和元数据的更新
原文地址:http://blog.csdn.net/sd_tz_wzg/article/details/40262979