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