Java中流的分类有哪些:
从流动方向上分:输入流、输出流
输入流:向文件写数据。
输出流:从文件中读数据。
从读取类型上分:字节流、字符流
字节流:以字节为基本处理单位。
字符流:以16位的Unicode码表示的字符为基本处理单位。
从发生的源头分:节点流、过滤流
节点流:用于直接操作目标设备对应的流。
过滤流:操作节点流,以更加灵活方便地读写各种类型的数据。
字节流InputStream和OutputStream的子类及各自的使用场景,与其对应的字符流:
文件流 FileInputStream 和 FileOutputStream:
用流的方式对文件进行读写操作。
对应的字符流:FileReader 和 FileWriter
字节数组流 ByteArrayOutputStream 和 ByteArrayInputStream:
字节数组和流之间的桥梁。
对应的字符流:StringReader 和 StringWriter
管道流 PipedInputStream 和 PipedInputStream:
通信管道的接收端和发送端。
对应的字符流:PipedReader 和 PipedWriter
对象流 ObjectOutputStream 和 ObjectInputStream:
能够输入/输出对象的流。
对应的字符流:ObjectReader 和 ObjectWriter
过滤流 FilterInputStream 和 FilterOutputStream:
对其他输入/输出流进行特殊处理,使得他们在读写数据的同时还可以对数据进行特殊处理。
对应的字符流:FilterReader 和 FilterWriter
缓冲流 BufferedInputStream 和 BufferedOutputStream:
带缓冲的过滤流,提供缓冲机制,提高读写效率。
对应的字符流:BufferedReader 和 BufferedWriter
数据流 DataInputStream 和 DataOutputStream:
以统一方式读写boolean、int、long、double等基本数据类型。
无对应字符流
打印流 PrintStream:
输出时自动完成特定功能。
对应的字符流:PrintWriter
字节流与字符流的转化:
输入的字节流有时需要转化为字符流,输出的字符流有时需要转化为字节流,转化过程也叫流的装配过程。。
1)输入字节流转为字符流需要用到 InputStreamReader 的构造方法:
InputStreamReader(InputStream in)
2)输出字符流转为字节流要用到 OutputStreamWriter 或 PrintWriter 的构造方法:
OutputStreamWriter(OutputStream out)
PrintWriter(OutputStream out)
这种转化并没有改变流的内容,只是改变了看“流”的角度。
Java中过滤流(流的装配)的作用:
对其他输入/输出流进行特殊处理,使得他们在读写数据的同时还可以对数据进行特殊处理。此外还提供了同步机制,使得某一时刻只有一个线程可以访问一个输入与输出流。主要是为了提高读写效率。
//将程序中的字符串用流装配的方式输出到屏幕上
import java.io.*;
public class PrintScreen{
public static void main(String[] args) throws Exception {
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out),true);
out.println("Hello");
对象的序列化(串行化)和反序列化(持久化):
将内存中的动态对象表达成为可以传输的串形式。对象串行化的目的是为了便于网络传输和介质存储。Java提供了Serializable接口,该接口没有任何方法,Java类只有实现Serializable接口才能够被串行化。类 ObjectOutputStream 和 ObjectInputStream 分别实现了接口 ObjectOutput 和 ObjectInput ,将数据流功能扩展到可以读写对象。
public class Test implements Serializable{
void write(String fname){
FileOutputStream fout = new FileOutputStream(fname)