IO流的分类可以分为以下三种:
第一种:输入流和输出流
按照流的流向来分,可以分为输入流和输出流。输入,输出都是从程序运行所在内存的角度来划分的。
输入流:只能从中读取数据,而不能向其写入数据,由InputStream和Reader作为基类。
输出流:只能向其写入数据,而不能从中读取数据。由OutputStream和Writer作为基类
第二种:字节流和字符流
字节流和字符流的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同。
字节流操作的数据单元是8位字节,由InputStream和OutputStream作为基类。
字符流操作的数据单元是16为的字符,由Reader和Writer作为基类
第三种:节点流和处理流
按照流的角色来分,可以分为节点流和处理流。
节点流:可以从向一个特定的IO设备(如磁盘、网络)读/写数据的流。也被称为低级流。
处理流:用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能。也称为高级流
1、流:(从流向来说分为两种)
java.io.InputStream 输入流 :从外部存储空间数据读到内存中
java.io.OutputSteam 输出流:从内存中将输入写到外部存储空间 (永久保存,不会自动消失)
2、流:(字节流、转换流、字符流)
字节流:用来操作字节文件,但也可以操作字符文件
所有字节输入流的超类是:InputStream(抽象类)
FileInputStream、BufferedInputStream、DataInputStream、ObjectInputStream
所有字节输出流的超类是:OutputStream(抽象类)
FileOutputStream、BufferedOutputstrea、DataOutputStream、 ObjectOutputStream
字符流:用来操作字符文件
Reader : BufferedReader 、 FileReader
Writer : BufferedWriter 、 FileWriter
转换流:
InputStreamReader
OutputStreamWriter
3、序列化
参与序列化与反序列化的类必须实现java.io.Serializable 接口,并推荐生成序列化ID
静态属性不参与序列化与反序列化操作
父类可以序列化,那么子类必然可以序列化,无论子类是否实现java.io.Serializable 接口
类序列化时,属性引用的对象也会被序列化
不参与序列化操作的属性需要标记为transient
装饰者模式:
import java.io.*;
import java.util.Scanner;
public class IOWriterReaderTest {
//装饰者模式
public static void main(String[] args) throws IOException {
Scanner input = new Scanner(new File("E:/test/1.txt"));
String name = input.next();
System.out.println(name);
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:/test/3.txt"));
osw.write("Hello");
osw.flush();
osw.close();
InputStreamReader isr = new InputStreamReader(new FileInputStream("E:/test/3.txt"));
char[] buffer = new char[512];
int len = -1;
StringBuffer sb = new StringBuffer();
while((len = isr.read(buffer)) != -1){
String str = new String(buffer,0,len);
sb.append(str);
}
System.out.println(sb); //Hello
isr.close();
}
}