处理流类型
缓冲流
四种缓冲流常用的构造方法:
- 缓冲输入流支持其父类的mark和reset方法;
- BufferedReader提供了readLine方法用于读取一行字符串(以\r或\n分隔);
- BufferedWriter提供了newLine用于写入一个行分隔符;
- 对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush方法将会使内存中的数据立刻写出。
转换流
- InputStreamReader和OutputStreamWriter用于字节数据到字符数据之间的转换。
- InputStreamReader需要和InputStream”套接”。
- OutputSreamWriter需要和OutputStream”套接”。
- 转换流在构造时可以指定其编码集合,例如:
InputStream isr=new InoutStreamReader(System.in,"ISO-8859-1")
数据流
DataInputStream和DataOutputStream直接把基础类型(比如long,float)存到内存(文件)中。
- DataInputStream和DataOutputStream分别继承自InputStrean和OutputStream,它属于处理流,需要分别“套接”在InputStream和OutputStream类型的节点流上。
- DataInputStream和DataOutputStream提供了可以存取与机器无关的JAVA原始类型数据(如:int,double等)的方法。
- DataInputStream和DataOutputStream的构造方法为:
DataInputStream(InputStream in)
DataOutputStream(OutputStream out)
举例如下:
ByteArrayOutputStream baos = new ByteArrayOutputStream();// 分配一个字节数组内存,baos是通往内存的ByteArray的输出流
DataOutputStream dos = new DataOutputStream(baos);// 包一个DataOutput的流
try {
dos.writeDouble(1.1111); // 直接写基础类型数据,占8个字节
dos.writeBoolean(true); // 直接写基础类型数据,占1个字节
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());// 通往内存的ByteArray的输入流
System.out.println(bais.available());// 9个字节
DataInputStream dis = new DataInputStream(bais);// 包一个DataInput的流
System.out.println(dis.readDouble()); //先写的先读,要按顺序
System.out.println(dis.readBoolean());
dos.close();
dis.close();
} catch (Exception e) {
e.printStackTrace();
}
Print流
- PrintWriter和PrintStream都属于输出流,分别针对于字符和字节。
- PrintWriter和PrintStream提供了重载的print
- Println方法用于多种数据类型的输出。
- PrintWriter和PrintStream的输出操作不会抛出异常,用户通过检测错误状态检测错误信息。
- PrintWriter和PrintStream有自动flush功能。
/*测试PrintStream*/
public static void main(String[] args) {
PrintStream ps = null;
try {
FileOutputStream fos = new FileOutputStream("G:\\workplace\\learning-java\\src\\shen\\l8\\des.txt");// 指向文件的流
ps = new PrintStream(fos);//流上包一个PrintStream
} catch (Exception e) {
e.printStackTrace();
}
if (ps != null) {
System.setOut(ps); // 默认指向System.out,现更改为指向ps流
}
int ln = 0;
for (char c = 0; c <= 600; c++) {
System.out.print(c + " ");
if (ln++ >= 100) {
System.out.println();
ln = 0;
}
}
}
Object流
- transient关键字:不序列化
- serializable接口:类必须实现该接口才能序列化
- externalizable接口:外部化,需要重写readExternal(in)和writeExternal(out)方法,相当于自己实现序列化
总结
- InputStream/OutputSream:基础抽象类
- Reader/Writer:基础抽象类
- FileInoutStream/FileOutputStream:文件读写字节流
- FileReader/FileWriter:文件读写字符流
- BufferedInputStream/BufferedOutputStream:带缓冲区的字节流
- BufferedReader/BufferedWriter:带缓冲区的字符流
- ByteArrayInputStream/ByteArrayOutputStream:内存里面的字节数组进行读写
- InputStreamReader/OutputStreamWriter:转换流,字节转换成字符(没有字符转换成字节)
- DataInutStream/DataOutputStream:直接读写基础类型数据或者UTF-8数据
- PrintStream/PrintWriter:输出流(没有in)
- ObjectInputStream/ObjectOutputStream:直接读写对象。transient使某变量不序列化、serializable是必须实现的接口、externalizable接口自己控制序列化。