流从流动方向上看:一般分为输入流和输出流
输入流:如System.in是一个InputStream类型输入流
输出流:如System.out 是一个PrintStream类型输出流
从读取类型上分:一般分为字节流和字符流
字节流:如System.in是一个InputStream类型字节流
字符流:如new InputStreamReader(System.in)是一个字符流对象
流从发生的源头:分为节点流和过滤流类
节点流:直接操作目标设备对应的流
如文件流,标准输入输出流
过滤流:继承带有关键字Filter的流
用于包装操作节点流,方便读写各种类型的数据
字节流InputStream和OutputStream的子类分别有哪些?
InputStream: ByteArrayInputStream、FileInputStream、FilterInputStream、ObjectInputStream、PipedInputStream、SequenceInputStream。
OutputStream: ByteArrayOutputStream、FileOutputStream、FilterOutputStream、ObjectOutputStream、PipedOutputStream。
ByteArrayInputStream:包含一个内部缓冲区,其中包含可以从流中读取的字节。
FileInputStream:从文件系统中的文件中获取输入字节。 哪些文件可用取决于主机环境。
FilterInputStream:包含一些其他输入流,它用作其基本数据源,可能沿途转换数据或提供附加功能。
ObjectInputStream:ObjectInputStream 反序列化之前使用 ObjectOutputStream 编写的原始数据和对象。ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对象图的持久存储。 ObjectInputStream 用于恢复之前序列化的那些对象。其他用途包括使用套接字流在主机之间传递对象或用于在远程通信系统中编组和解组参数和参数。ObjectInputStream 确保从流创建的图中所有对象的类型与 Java 虚拟机中存在的类相匹配。使用标准机制根据需要加载类。
PipedInputStream:管道输入流应该连接到管道输出流; 管道输入流然后提供写入管道输出流的任何数据字节。
SequenceInputStream:表示其他输入流的逻辑串联。 它从输入流的有序集合开始,从第一个流读取,直到到达文件末尾,然后从第二个流读取,依此类推,直到在最后一个包含的输入流上到达文件末尾。
ByteArrayOutputStream:这个类实现了一个输出流,其中数据被写入一个字节数组。 缓冲区会随着数据写入而自动增长。
FileOutputStream:文件输出流是用于将数据写入File
或FileDescriptor
的输出流。 文件是否可用或是否可以创建取决于底层
平台。
FilterOutputStream:这个类是所有过滤输出流的类的超类。 这些流位于已经存在的输出流(底层输出流)之上,它用作其基本的数据接收器,但可能会在此过程中转换数据或提供附加功能
ObjectOutputStream: 将 Java 对象的原始数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。对象的持久存储可以通过对流使用文件来实现。如果流是网络套接字流,则可以在另一个主机或另一个进程中重构对象。
PipedOutputStream:管道输出流可以连接到管道输入流
创建通信管道。 管道输出流是
管道的发送端。
字节流与字符流的转化:nputStreamReader和OutputStreamWriter,这两个为类是字节流和字符流之间相互转换的类。
过滤流: BufferedInputStream和BufferedOutputStream, 缓存作用,用于装配文件磁盘、网络设备、终端等读写开销大的节点流,提高读写性能
过滤流BufferedReader的使用:用于缓存字符流,可以一行一行的读
import java.io.*;
public class test {
public static void main(String args[]) {
try {
BufferedReader keyin = new BufferedReader(new
InputStreamReader(System.in));
String c1;
int i = 0;
int[] e = new int[10];
while (i < 10) {
try {
c1 = keyin.readLine();
e[i] = Integer.parseInt(c1);
i++;
} catch (NumberFormatException ee) {
System.out.println("请输入正确的数字!");
}
}
for(int l = 0;l <10;++l)
System.out.println(e[l]);
} catch (Exception e) {
System.out.println("系统有错误");
}
}
}
运行结果:
12
sdasd
请输入正确的数字!
23
dsad
请输入正确的数字!
12
5
24
235
24
423
54
45
12
23
12
5
24
235
24
423
54
45
过滤流 DataInputStream和DataOutputStream的使用, 可从字节流中写入、读取Java基本数据类型,不依赖于机器的具体数据类型,方便存储和恢复数据
import java.io.*;
public class hwi {
public static void main(String[] args) throws Exception {
try {
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new
FileOutputStream("test.txt")));
dos.writeInt(3);//写入整型
dos.writeDouble(3.14);//写入浮点型
dos.writeUTF("hello");//写入字符串
dos.close();
DataInputStream dis = new DataInputStream(new BufferedInputStream(new
FileInputStream("test.txt")));
System.out.println(dis.readInt()); //读取整型,输出3
System.out.println(dis.readDouble()); //读取浮点型,输出3.14
System.out.println(dis.readUTF()); //读取字符串,输出hello
dis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
运行结果:
3
3.14
hello
序列化和反序列化:序列化--将对象写到一个输出流中。反序列化则是从一个输入流中读取一个对象。类中的成员必须是可序列化的,而且要实现Serializable接口,这样的类的对象才能被序列化和反序列化。通过对象输出流的writeObject()写对象。注意使用类型转化,转换为相应的类的对象。通过对象输出流的readObject()写对象。
file对应磁盘上的一个文件(路径),而Java中File类提供了一些可以对文件进行操作的方法,读写操作等。
读操作:FileInputStream与FileReader两个类进行支持;
写操作:FileOutputStream与FileWriter两个类进行支持;