Java基础:IO流之合并流

简介

合并流就是 java.io.SequenceInputStream,它可以将多个输入流对象,当做一个流来处理。

方法摘要

构造方法

1
2
SequenceInputStream(Enumeration<? extends InputStream> e)   //将一个枚举对象中的所有输如流当做一个流
SequenceInputStream(InputStream s1, InputStream s2) //将两个输入流当做一个流。

普通方法

1
2
3
4
int available() //返回合并后的所有流的总可操作字节数
void close() //关闭此输入流并释放与此流关联的所有系统资源
int read() //从输入流中读取下一个数组字节
int read(byte[] b, int off, int len) //将最多 len 个字节从此输入流读入 byte 数组

综合练习

合并三个文本文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.io.*;
import java.util.*;

public class SequenceInputStreamDemo {
public static void main(String[] args) throws IOException {
Vector<FileInputStream> v = new Vector<FileInputStream>();

v.add(new FileInputStream("E:\\1.txt"));
v.add(new FileInputStream("E:\\2.txt"));
v.add(new FileInputStream("E:\\3.txt"));

Enumeration<FileInputStream> en = v.elements();

SequenceInputStream sis = new SequenceInputStream(en);

byte[] b = new byte[1024];
int size = 0;

FileOutputStream fos = new FileOutputStream("E:\\4.txt");

while ((size = sis.read(b)) != -1) {
fos.write(b, 0, size);
}

fos.close();
sis.close();

}
}

将一个文件切割成多个文件

这里演示的是将一个 MP3 文件切割成 n 个 1M 的碎片文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void splitFile() throws IOException{
FileInputStream fis = new FileInputStream("E:\\music.mp3");
FileOutputStream fos = null;

byte[] b = new byte[1024 * 1024];

int size = 0;
int count = 1;
while ((size = fis.read(b)) != -1) {
fos = new FileOutputStream("E:\\split\\music" + count++ + ".part");
fos.write(b, 0, size);
}

fis.close();
fos.close();
}

将切割的文件合并回源文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static void merge () throws IOException {
Vector<FileInputStream> v = new Vector<FileInputStream>();

//这里 i < 12 是因为刚才我把一个文件切割成了 12 份
for (int i = 1; i <= 12; i++) {
v.add(new FileInputStream("E:\\split\\music" + i + "part"));
}

Enumeration<FileInputStream> en = v.elements();

SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream("E:\\split\\music.mp3");

byte[] b = new byte[1024];

int size = 0;
while ((size = sis.read(b)) != -1) {
fos.write(b, 0, size);
}

fos.close();
sis.close();
}

注意:切割文件那里定义临时的字节数组,不要过大,如你要将文件分割成 10M 的等份,可以创建一个 1M 的数组: byte[] b = new byte[1024 * 1024]; ,然后循环 10 次即可,因为创建过大的输入容易造成内存溢出。