浅析Java.IO输入输出流 过滤流 Buffer流和Data流
什么是Java IO
Java IO 是针对输入和输出数据的流处理 API。Java IO 库中包含了一组类和接口,提供了对标准输入、输出和文件系统的访问。
在 Java IO 中,数据承载的载体为流(stream)。流是指在数据源和数据目的地之间建立起的一条虚拟的传输通道,数据按照字节的方式在流中传输。Java IO 中的流可以按照接口和实现类分为四种:
- 字节流
- 字符流
- 过滤流
- 对象流
在本篇攻略中,我们将着重介绍流中的两种:过滤流和缓冲流。
过滤流
过滤流(FilterStream)是一种节点流,它对新的输入流或输出流添加功能的流。FilterInputStream 和 FilterOutputStream 为其提供了基础。所有的过滤流都是对一个输入流或输出流进行操作,因此其作用可以理解为“修饰”流,通过向构造方法中传递InputStream或OutputStream来简化其他流的操作。
使用过滤流可以在运行时根据需要添加或删除某些特性,进而提高流读写的效率和灵活性。
示例1:使用 GZIP 压缩过滤流压缩文件
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
public class CompressedFile {
public static void main(String[] args) throws IOException {
String fileInput = "example.txt";
String fileOutput = "example.gz";
FileInputStream input = new FileInputStream(fileInput);
GZIPOutputStream gzipOutput = new GZIPOutputStream(new FileOutputStream(fileOutput));
byte[] buffer = new byte[1024];
int len;
while ((len = input.read(buffer)) > 0) {
gzipOutput.write(buffer, 0, len);
}
input.close();
gzipOutput.finish();
gzipOutput.close();
System.out.println("File successfully compressed.");
}
}
上述代码使用 GZIP 压缩过滤流压缩文件。通过使用 GZIPOutputStream 将字节数据压缩成 gzip 文件。需要注意的是,输出流参数中传递的是 FileOutputStream,这是一种节点流,这也可以理解为是一种过滤流。
缓冲流
与过滤流相似,缓冲流(BufferStream)也是一种节点流,它包装了对其他输入输出流的操作,添加了缓存功能,以提高已有输入输出流的效率。所以,它提供了对读写大量数据时的缓存机制,避免了频繁读写硬盘等设备造成的性能问题。
缓冲流依然是与其他输入输出流配合使用的,常用的缓冲流包括BufferedInputStream 和 BufferedOutputStream。
示例2:从文件中读取大量数据
import java.io.*;
public class ReadFromFile {
public static void main(String[] args) throws IOException {
String file = "example.txt";
int bufferSize = 8 * 1024;
InputStream inputStream = new FileInputStream(file);
BufferedInputStream bufferedInput = new BufferedInputStream(inputStream, bufferSize);
byte[] bytes = new byte[bufferSize];
int offset = 0;
int numRead;
while ((numRead = bufferedInput.read(bytes, offset, bufferSize)) > 0) {
offset += numRead;
}
bufferedInput.close();
System.out.println("File successfully read.");
}
}
上述代码演示了如何通过缓冲流从文件中读取大量数据。通过使用 BufferedInputStream 及其构造方法的“bufferSize”参数指定缓冲区大小。例如本例中,缓冲大小被设定为 8kb,即缓冲区可以存储 8 * 1024 个字节。读取到的数据先全部存入缓冲区,再从缓冲区获取数据,避免了频繁读写硬盘等设备造成的性能问题,从而使文件的读写效率有了很大的提升。
Data流
Data流是Java IO中的一种数据源和数据目的地都是Java基本数据类型,与其他输入输出流不同,它不仅支持数据的读写,还提供了一些转换数据格式的方法,如 readInt() 和 writeInt() 方法,用于读写整数数据。
Java IO 中的 DataInputStream 和 DataOutputStream 是实现 Data流 的基础。DataOutputStream 提供了向输出流的方法,用来写入基本类型和字符串等常见类型数据;DataInputStream 提供了来自输入流的方法,用来读取和反序列化出写入到 DataOutputStream 中的类型数据。
示例3:读写基本数据类型
import java.io.*;
public class DataStreamExample {
public static void main(String[] args) throws Exception {
String dataFile = "example.txt";
BufferedOutputStream bufferedOutput = new BufferedOutputStream(new FileOutputStream(dataFile));
DataOutputStream dataOutput = new DataOutputStream(bufferedOutput);
dataOutput.writeDouble(3.1415926);
dataOutput.writeInt(1000000);
dataOutput.writeBoolean(false);
dataOutput.close();
BufferedInputStream bufferedInput = new BufferedInputStream(new FileInputStream(dataFile));
DataInputStream dataInput = new DataInputStream(bufferedInput);
System.out.println(dataInput.readDouble());
System.out.println(dataInput.readInt());
System.out.println(dataInput.readBoolean());
dataInput.close();
System.out.println("File successfully read.");
}
}
上述代码演示了如何使用 Data 输入输出流在文件中读取和写入基本数据类型。该例子首先创建一个文件,并将基本数据类型写入该文件。寻找数据逐个创建一个 DataInputStream,读取文件中的各个数据,再依交叉读取数据读取数据。最后,关闭 DataInputStream,道旁文件读取结束。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析Java.IO输入输出流 过滤流 buffer流和data流 - Python技术站