IO流:
输出流:OutputStream和Writer 作为基类
按流向区分
输入流:InputStream和Reader 作为基类
输入输出流是相对于计算机内存来说的,而不是相对于源和目标。
字节流输出:InputStream
字节流:字节流输入:OutputStream
按照处理数据单元划分
字符流:字符流输出:Reader
字符流输入:Writer
字节流是8位通用字节流,字符流是16为Unicode字符流。
节点流:可以直接从数据源或目的地读写数据。
处理流(包装流):不直接连接到数据源或目的地,是其他流进行封装。目的主要是简化操作和提高性能。
节点流和处理流的关系:
节点流处于io操作的第一线,所有操作必须通过他们进行。处理流可以对其他流进行处理(提高效率或操作灵活性)。
文本读写:用FileInputStream和 FileOutputStream、 BufferedReader和 BufferedWriter
二进制文件的读写:
DataInputStream 和DataOutputStream 读写二进制文件以及基本数据类型
对象的读写:
ObjectInputStream 和ObjectOutputStream读写对象(序列化和反序列化)
创建FileOutputStream(String name,bolleanappend)实例时,如果相应的文件并不存在,则会自动创建一个空的文件。不加后面boolean类型的判断时,则会覆盖文件中的所有内容。
// 创建一个文件输入字节流对象
File f = new File("d:/abc.txt");
FileInputStream fis = new FileInputStream(f);
// 开始读每次一个字节
int len ;
byte[] b = new byte[1024];
while ((len=fis.read(b)) != -1) {
// byte[]转String
System.out.println(new String(b));
}
// 读完之后
fis.close();
FileReader fr = new FileReader("d:/123.txt");
int len = 0;
char[] a = new char[1024];
StringBuffer sb = new StringBuffer();
while ((len = fr.read(a)) != -1) {
sb.append(a);
}
fr.close();
以上是文件读写的两个例子。
缓冲流:带有缓冲区可以提高读取的速度。
BufferedInputStream和 BufferedOutputStream 字节缓冲流
BufferedReader 和BufferedWriter 字符缓冲流
FileWriter fw=new FileWriter("d:/123.txt");
BufferedWriter bw=new BufferedWriter(fw);
fw.write("世界如此美好!");
bw.flush();//刷新缓存(只有刷新了才可以写入文件)
fw.close();
bw.close();
字节流转字符流:InputStreamReader(字符流对象,”编码方式”);
序列化和反序列化 目的:持久化对象,将对象在网络上进行传输。
序列化:将内存中的对象转换位流。
反序列化:将流装换为内存中的对象。
ObjectOutputStream ots=new ObjectOutputStream(new FileOutputStream("d:/123.txt"));
ots.writeObject(new Student2("张三",22,"男"));//序列化
ots.close();
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("d:/123.txt"));
Student2 stu=(Student2)ois.readObject();//反序列化
ois.close();
System.out.println(stu);
对象流ObjectInputStream:
1、 必须实现Serializable接口
2、 给类增加序列化编号,给类定义一个标记,新的修改后的类还可以操作曾经序列化的对象。
3、 静态是不能被序列化的,序列化只能对堆中的进行序列化。
4、 不需要序列化的字段前加transient