在前面几天中我们都在不断的学习Java中一个重要的API——io类,现在我们进行总结
读入与写出
首先我们来了解一下什么是数据的读入与写出,为什么要有io流来读入写出这些数据。我们先来认识一下在计算机内部中数据都是以二进制来存储与传递的,因此我们不能直接对数据进行操作,需要借助io类中的一些标准的读写操作来完成对不同设备的读写数据工作。
java将IO按照方向划分为输入与输出,参照点是我们写的程序.
输入:用来读取数据的,是从外界到程序的方向,用于获取数据.
输出:用来写出数据的,是从程序到外界的方向,用于发送数据.
将IO比喻为"流",即:stream. 就像生活中的"电流","水流"一样,它是以同一个方向顺序移动的过程.只不 过这里流动的是字节(2进制数据).所以在IO中有输入流和输出流之分,我们理解他们是连接程序与另一端 的"管道",用于获取或发送数据到另一端.
注意:读写是顺序读写的,只能顺序向后写或向后读,不能回退。
数据的读入
java.io.InputStream:所有字节输入流的超类,其中定义了读取数据的方法.因此将来不管读取的是 什么设备(连接该设备的流)都有这些读取的方法,因此我们可以用相同的方法读取不同设备中的数据
常用方法:
int read():读取一个字节,返回的int值低8位为读取的数据。如果返回值为整数-1则表示读取到了 流的末尾
int read(byte[] data):块读取,最多读取data数组总长度的数据并从数组第一个位置开始存入到 数组中,返回值表示实际读取到的字节量,如果返回值为-1表示本次没有读取到任何数据,是流的末尾。
数据的读出
java.io.OutputStream:所有字节输出流的超类,其中定义了写出数据的方法.
常用方法:
void write(int d):写出一个字节,写出的是给定的int值对应2进制的低八位。
void write(byte[] data):块写,将给定字节数组中所有字节一次性写出。
void write(byte[]data,int off,int len):块写,将给定字节数组从下标off处开始的连续len个字节一 次性写出。
节点流与处理流概述
在Java的IO(输入/输出)系统中,流被分为两大类:节点流(也称为低级流)和处理流(也称为高级流)。这两类流在数据处理中扮演着不同的角色。
节点流:直接连接数据源或目标(如文件、内存等)的流。它们是IO操作的基础,用于实际的读写数据。由于它们直接操作数据源,因此被称为“节点”流。
处理流:不直接连接数据源,而是包装在另一个流(可以是节点流或其他处理流)之上,用于在数据流经时对其进行加工处理,如缓冲、转换格式等。处理流的存在简化了对数据处理的复杂度。
文件流
文件流是一对低级流,用于读写文件的流。
java.io.FileOutputStream文件输出流,继承自java.io.OutputStream
常用构造器
覆盖模式对应的构造器 覆盖模式是指若指定的文件存在,文件流在创建时会先将该文件原内容清除。
FileOutputStream(String pathname):创建文件输出流用于向指定路径表示的文件做写操作 FileOutputStream(File file):创建文件输出流用于向File表示的文件做写操作。
注:如果写出的文件不存在文件流自动创建这个文件,但是如果该文件所在的目录不存在会抛出异 常:java.io.FileNotFoundException
追加写模式对应的构造器 追加模式是指若指定的文件存在,文件流会将写出的数据陆续追加到文件中。
FileOutputStream(String pathname,boolean append):如果第二个参数为true则为追加模式, false则为覆盖模式
FileOutputStream(File file,boolean append):同上
常用方法:
void write(int d):向文件中写入一个字节,写入的是int值2进制的低八位。 void write(byte[] data):向文件中块写数据。将数组data中所有字节一次性写入文件。 void write(byte[] data,int off,int len):向文件中快写数据。将数组data中从下标off开始的连 续len个字节一次性写入文件
对象流
对象流是一对高级流,在流链接中的作用是完成对象的序列化与反序列化
序列化:是对象输出流的工作,将一个对象按照其结构转换为一组字节的过程。
反序列化:是对象输入流的工作,将一组字节还原为对象的过程。
java.io.ObjectInputStream对象输入流,继承自java.io.InputStream 常用构造器
ObjectInputStream(InputStream in):
创建一个对象输入流并连接到参数in这个输入流上。
常用方法
Object readObject():进行对象反序列化,将读取的字节转换为一个对象并以Object形式返回(多态)。 如果读取的字节表示的不是一个java对象会抛出异常:java.io.ClassNotFoundException
java.io.ObjectOutputStream对象输出流,继承自java.io.OutputStream 常用构造器
ObjectOutputStream(OutputStream out):
创建一个对象输出流并连接到参数out这个输出流上
常用方法
void writeObject(Object obj):进行对象的序列化,将一个java对象序列化成一组字节后再通过连接的 输出流将这组字节写出。
如果序列化的对象没有实现可序列化接口:java.io.Serializable就会抛出异 常:java.io.NotSerializableException
序列化接口java.io.Serrializable
该接口没有任何抽象方法,但是只有实现了该接口的类的实例才能进行序列化与反序列化。 实现了序列化接口的类建议显示的定义常量:static final long serialVersionUID = 1L;
可以为属性添加关键字transient,被该关键字修饰的属性在序列化是会被忽略,达到对象序列化瘦身 的目的。
字符流
java将流按照读写单位划分为字节与字符流。字节流以字节为单位读写,字符流以字符为单位读写。
转换流java.io.InputStreamReader和OutputStreamWriter
1:衔接其它字节与字符流
2:将字符与字节进行转换 相当于是现实中的"转换器" 缓冲字符输出流
PrintWriter和BufferedReader :
1:块写或块读文本数据加速
2:可以按行写或读字符串 java.io.PrintWriter 具有自动行刷新的缓冲字符输出流
常用构造器
PrintWriter(String filename) :可以直接对给定路径的文件进行写操作
PrintWriter(File file):可以直接对File表示的文件进行写操作
上述两种构造器内部会自动完成流连接操作。
PrintWriter(OutputStream out):将PW链接在给定的字节流上(构造方法内部会自行完成转换流等流连 接)
PrintWriter(Writer writer):将PW链接在其它字符流上
PrintWriter(OutputStream out,boolean autoflush) PrintWriter(Writer writer,boolean autoflush)
上述两个构造器可以在链接到流上的同时传入第二个参数,如果该值为true则开启了自动行刷新功能。 常用方法 void println(String line):按行写出一行字符串 特点 自动行刷新,当打开了该功能后,每当使用println方法写出一行字符串后就会自动flush