字节流家族

目录

一. 前言

二. 实现类

2.1. FileInputStream/FileOutputStream

2.2. ByteArrayInputStream/ByteArrayOutputStream

2.3. ObjectInputStream/ObjectOutputStream

2.4. PipedInputStream/PipedOutputStream

2.5. FilterInputStream/FilterOutputStream

2.6. DataInputStream/DataOutputStream

2.7. BufferedInputStream/BufferedOutputStream

2.8. PushbackInputStream

2.9. Zip相关流


一. 前言

        字节流是按照字节的方式读取数据,一次读取一个字节,也就是8个二进制位,这种流是万能的,什么类型的文件都可以读取,包括:文本文件,图片,声音文件,视频文件等。通常如果文件能通过记事本打开,我们还可以读懂里面的内容,就使用字符流,否则使用字节流。如果不知道该使用哪种类型的流,就使用字节流。

InputStream 是所有字节输入流的父类,OutputStream 是所有字节输出流的父类;以 Stream 结尾的都是字节流;

 

二. 实现类

2.1. FileInputStream/FileOutputStream

FileInputStream 用于读取本地文件中的字节数据,继承InputStream类。
FileOutputStream 将字节数据写到文件,继承OutputStream类。

FileInputStream fis = new FileInputStream("d:\\aa.txt");
FileOutputStream fos = new FileOutputStream("d:\\aa.txt");

2.2. ByteArrayInputStream/ByteArrayOutputStream

ByteArrayInputStream中包含一个内部缓冲区,用来包含那些可能从流中读的字节数组。还有一个内部计数器来跟踪下一个将被读取的字节。ByteArrayInputStream只能用字节数组来进行构造。

ByteArrayInputStream bais = new ByteArrayInputStream(str.getBytes("UTF-8"));

ByteArrayOutputStream中也有一个内部缓冲区,当数据写入是缓冲区会自动增长,内部有一个计数器来记录缓冲区的字节数。

ByteArrayOutputStream baos = new ByteArrayOutputStream();

String str="hello  world";
ByteArrayInputStream bais = new ByteArrayInputStream(str.getBytes("UTF-8"));

int ch = 0;
while((ch = bais.read()) != -1) { // 读到尾部返回-1
	baos.write(ch); // 一个个字节写入到baos中
}

2.3. ObjectInputStream/ObjectOutputStream

允许把内存中的java对象转换成平台无关的二进制流,从而允许把这种二进制流永久的保存到磁盘上,或通过网络将这种二进制流传输到另一个网络节点。(序列化ObjectOutputStream)
当其他程序获取了这种二进制流,就可以恢复成原来的java对象。(反序列化ObjectInputStream)

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));

2.4. PipedInputStream/PipedOutputStream

管道流其实是一个很有魅力的流,用法也很独特。他用来连接两个线程之间的通信,比如传输文件等。它们的作用是让多线程可以通过管道进行线程间的通讯。在使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用。

2.5. FilterInputStream/FilterOutputStream

FilterInputStream和FilteOutputStream分别是过滤输入流和过滤输出流,他们的作用是为基础流提供一些额外的功能。FilterInputStream常见的子类有DataInputStream、BufferedInputStream以及PushBackInputStream等。FilteOutputStream常见的子类有DataOutputStream、BufferedOutputStream以及PrintStream等。

2.6. DataInputStream/DataOutputStream

DataInputStream和DataOutputStream可以读取或写入Java中的基本数据类型的变量或字符串。因为输入时是按顺序输入的,所以读取时也需要按顺序读取,否则会报错。

// 创建写出,读入流文件,构造器中放入节点流对象.
DataOutputStream dos = new DataOutputStream(new FileOutputStream("test.txt"));
DataInputStream dis = new DataInputStream(new FileInputStream("test.txt"));

dos.writeInt(20);
dos.writeUTF("Tom");
dos.writeChar('M');

System.out.println(dis.readInt());
System.out.println(dis.readUTF());
System.out.println(dis.readChar());

2.7. BufferedInputStream/BufferedOutputStream

BufferedInputStream: 缓冲字节输入流,是一个高级流(处理流),与其他低级流配合使用。
BufferedOutputStream: 缓冲字节输出流,是一个高级流(处理流),与其他低级流配合使用。

FileInputStream fis = new FileInputStream("demo.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
String content = null;
// 自己定义一个缓冲区
byte[] buffer = new byte[10240];
int flag = 0;
while((flag = bis.read(buffer)) != -1){
	content += new String(buffer, 0, flag);
}
System.out.println(content);
FileOutputStream fos = new FileOutputStream("demo.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
String content = "我是缓冲输出流测试数据!";
bos.write(content.getBytes(), 0, content.getBytes().length);
bos.flush();
bos.close();

2.8. PushbackInputStream

PushbackInputStream给输入流增加了一个新的功能,即可以使用unread()方法将读取的字节数据推回读取的字节数据。

2.9. Zip相关流

DeflaterOutputStream和DeflaterInputStream类提供了以deflate格式压缩数据的机制。
InflaterOutputStream和InflaterInputStream类提供了以deflate格式压缩数据的机制。

CheckedInputStream和CheckedOutputStream:这是两个过滤流,用于维护数据校验和。校验和是用于维护数据完整性的一项技术。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流华追梦

你的鼓励将是我创作最大的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值