最近看了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 ObjectOutputStreamSerializable接口,对对象进行序列化,我认为没有序列化的情况下,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(); } }