最近看了I/O流的相关知识,有太多的类了,搞得特别混淆。
但是!!!
发现如果在操作文件的时候把“流”理解成一根管子,就可以很清楚的辨识和理解了。
套管子,假设如果要对一个文件或者输入的东西进行输入或者输出(写/读)那必定需要使用 FileInputStream/FileOutputStream 或者是FileReader/FileWriter
但他们读的 话只有read()方法一种,单个单个的读取太麻烦了,于是就有BufferedReader的管子嵌套,查API文档readLine()方法 :读取一行文本
哇哦,比起一个一个的读取,一行一行的读取大大减少了磁盘的工作量,那肯定要用BufferedReader类的readLine()方法方法了!
画一张图:
各个管子的嵌套有File的前缀就是预先处理File文件的,然后如果有Reader后缀,那么后面直接可以加上Buffer缓冲流,没有Reader后缀就要加转换流然后才可以加缓冲流。
写文件同理。
整理了下基本的类java.io包里的类
字节流--- InputStream----FilelnputSteam
OutputStream----FileOutputStream
字节缓冲流--- BufferedlnputSteam
BufferedOutputStream
转换流--- InputStreamReader
BufferedReader
字符缓冲流---
BufferedWriter
Reader---FileReader
字符流---
Writer----FileWriter
打印流--- PrintStream
数据字节流--- DatalnputStream
DataOutputStrean
对象流--- ObjectinputStream
ObjectOutputStream
Serializable接口,对对象进行序列化,我认为没有序列化的情况下,Object*是无法完成对对象的操作的。
上一个简单的Object的代码:
ObjectTest:
package com.IO;
import java.io.*;
public class ObjectTest {
public static void main(String[] args){
FileOutputStream fos = null;
ObjectOutputStream oos = null;
Student s1 = new Student("Zhangsan",23);
//Student s2 = new Student("Lisi",24);
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
fos = new FileOutputStream("doc\\t.tmp");
oos = new ObjectOutputStream(fos);//捅fos的管子
oos.writeObject(s1);
fos.flush();//刷新缓冲流
oos.flush();
fis = new FileInputStream("doc\\t.tmp");
ois = new ObjectInputStream(fis);
Object o = ois.readObject();
System.out.println(((Student)o).getName()+"|"+((Student)o).getAge());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally {
//倒着关
}
}
}
Student:
package com.IO;
import java.io.Serializable;
public class Student implements Serializable {//序列化
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Student() {
super();
}
}