时间:2022-12-29 10:52:53 | 栏目:JAVA代码 | 点击:次
3.1 Java 流概述
文件通常是由一连串的字节或字符构成,组成文件的字节序列称为字节流,组成文件的字符
序列称为字符流。Java 中根据流的方向可以分为输入流和输出流。输入流是将文件或其它输入
设备的数据加载到内存的过程;输出流恰恰相反,是将内存中的数据保存到文件或其他输出设
备,详见下图:
文件是由字符或字节构成,那么将文件加载到内存或再将文件输出到文件,需要有输入和输出
流的支持,那么在 Java 语言中又把输入和输出流分为了两个,字节输入和输出流,字符输入
和输出流。
3.2InputStream(字节输入流)
InputStream 是字节输入流,InputStream 是一个抽象类,所有继承了 InputStream 的类都是
字节输入流,主要方法:
void close() 关闭此输入流并释放与该流关联的所有系统资源。 abstract int read() 从输入流读取下一个数据字节。 int read(byte[] b) 从输入流中读取一定数量的字节并将其存储在缓冲 区数组 b 中。 int read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入字节数组。
3.3 OutputStream(字节输出流)
所有继承了 OutputStream 都是字节输出流
void close() 关闭此输出流并释放与此流有关的所有系统资源。 void flush() 刷新此输出流并强制写出所有缓冲的输出字节。 void write(byte[] b) 将 b.length 个字节从指定的字节数组写入此输出 流。 void write(byte[] b, int off, int len) 将指定字节数组中从偏移量 off 开始的 len 个字 节写入此输出流。 abstract void write(int b) 将指定的字节写入此输出流。
3.4 Reader(字符输入流)
abstract void close() 关闭该流。 int read() 读取单个字符。 int read(char[] cbuf) 将字符读入数组。 abstract int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。
3.5 Writer(字符输出流)
Writer append(char c) 将指定字符追加到此 writer。 abstract void close() 关闭此流,但要先刷新它。 abstract void flush() 刷新此流。 void write(char[] cbuf) 写入字符数组。 abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。 void write(int c) 写入单个字符。 void write(String str) 写入字符串。 void write(String str, int off, int len) 写入字符串的某一部分。
字符流和字节流的使用非常相似,但是实际上字节流的操作不会经过缓冲区(内存)而是直接操作文本本身的,而字符流的操作会先经过缓冲区(内存)然后通过缓冲区再操作文件以字节为单位输入输出数据,字节流按照 8 位传输以字符为单位输入输出数据,字符流按照 16 位传
它是一种数据的流从源头流到目的地。比如文件拷贝,输入流和输出流都包括了。输入流从文件中读取数据存储到进程(process)中,输出流从进程中读取数据然后写入到目标文件。
在 java.io 包中主要由 4 个可用的 filter Stream。两个字节 filter stream,两个字符 filter stream. 分别是 FilterInputStream, FilterOutputStream, FilterReader and FilterWriter.这些类是抽象类,不能被实例化的。
按照流的方向:输入流(inputStream)和输出流(outputStream)按照实现功能分:节点流(可以从或向一个特定的地方(节点)读写数据。如 FileReader)和处理流(是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如 BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。)按照处理数据的单位: 字节流和字符流。字节流继承于 InputStream 和 OutputStream, 字符流继承于 InputStreamReader 和 OutputStreamWriter 。
有两种方式:1). 实现 Cloneable 接口并重写 Object 类中的 clone()方法;2). 实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆
缓冲区就是一段特殊的内存区域,很多情况下当程序需要频繁地操作一个资源(如文件或数据库)则性能会很低,所以为了提升性能就可以将一部分数据暂时读写到缓存区,以后直接从此区域中读写数据即可,这样就可以显著的提升性能。对于 Java 字符流的操作都是在缓冲区操作的,所以如果我们想在字符流操作中主动将缓冲区刷新到文件则可以使用 flush() 方法操作。