io流的分类
(1)以数据流的方向划分为:输入流与输出流。
(2)以数据流的传输单位划分为:
a.字节流:InputStream, OutputStream
b.字符流:Reader 和Writer
(3)以数据流的处理方式划分为:节点流和处理流。
InputStream、FileInputStream(对InputStream抽象类的实现)、Reader 、ByteArrayInputStream(可以理解为内存当中的一条输入管道)都是节点流;
BufferedInputStream、FileReader、DataInputStream(直接读基本数据如,readInt) 是处理流
参考如下代码:
import java.io.*;
public class TestDataStream {
public static void main(String[] args) {
ByteArrayOutputStream baos =
new ByteArrayOutputStream();
//节点流,OutputStream抽象类的一种实现
DataOutputStream dos =
new DataOutputStream(baos);
//处理流,可以看做在ByteArrayOutputStream管道上有套了一层管道,可以更方便的保存,而且节省字节,比如一个long类型的数:1234567890只占8字节,而要以字符串保存需要更多的字节
try {
dos.writeDouble(Math.random());
dos.writeBoolean(true);
ByteArrayInputStream bais =
new ByteArrayInputStream(baos.toByteArray());
//baos.toByteArray()可以看出是内存,此处也可使用file
System.out.println(bais.available());
DataInputStream dis = new DataInputStream(bais);
System.out.println(dis.readDouble());
System.out.println(dis.readBoolean());
dos.close(); dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
字节流与字符流的转换
InputStreamReader 可以将一个字节流中的字节编码成字符
BufferedReader br = new BufferedReader(new InputStreamReader(System.io));
PrintStream
PrintStream(字节流)\PrintWrite(字符流)类可以将基本数据类型格式化成字符串输出
System.setOut(new PrintStream(FileOutputSteam))
将PrintStream此管道捅到一个文件中,那以后System.out.print()就是直接输出到文件中了
ObjectInputStream/ObjectOutputStream
ObjectInputStream/ObjectOutputStream类用于将序列化的类读取和保存,Serializable接口没有定义任何方法,仅仅作为标记;实现Externalizable extends Serializable接口,可以自己实现Object的读取和写入的过程。transient和static类型的成员变量不会被保存和读取。