第五篇:Java——利用IO流和Vector集合实现文件的拆分合并
----------------------------------------------------------------------------------------------------------
今天我们来给大家演示一下如何使用IO流和Vector集合去实现一个文件的拆分和合并,这里我们使用音频文件来演示
首先,我们要知道,IO流分为字节流和字符流。因为音频文件不是字符类文件,所以只能使用字节流来操作,字节流中有一个比较特殊的流叫做SequenceInputStream,他可以按照顺序输入字节数据,具体的使用方法以及构造可以查API,这里就不做过多解释了。那么为什么选用Vector集合呢。是因为Vector集合中有一个方法v.elements()可以得到集合中的所有项。那么下面我们就来看下这个例子,具体的了解一下是如何拆分合并文件的:
例1:将一个music.mp3文件,拆分成多个小文件, 再将多个小文件, 合并成一个mp3文件. 假如一份拆成 1M , 总共拆分五份 ,剩下的为最后一份;最后将5份再合成一份。
代码如下:
public class Test {
//主方法
public static void main(String[] args) throws IOException {
//调用拆分方法
chaifen();
//调用合并方法
hebing();
}
//1.拆分
private static void chaifen() throws IOException {
//new一个输入流将源文件封装,后面参数写原文件的地址和文件名
FileInputStream in = new FileInputStream(new File("F:\\夜夜夜夜.mp3"));
//再封装一个新的文件夹,用来存储拆分后的五个音频文件
File file = new File("F:\\音乐");
//判断一下有没有这个文件夹,如果没有则新建
if (!file.exists()){
file.mkdirs();
}
//新建一个缓冲数组,用来存储输入流的字节,这里设置1024*104为1M,因为我们想要分成五分
byte[] bytes = new byte[1024 * 1024];
//设置一个标记,开始值为0
int len = 0;
//设置五个小音频文件的名字,我们这里采用数字++的方法,当然你们也可以设置随机数,随机字符串
int minName=1;
//循环输出缓冲数组里的字节,前四次为1M,最后一次为0.36M。当读不到字节数时默认返回-1,所以我们这里让他不等于-1
while ((len = in.read(bytes))!=-1){
//new一个输出流,从缓冲数组中一次拿1M存储到小音频文件中
FileOutputStream out = new FileOutputStream(new File(file, (minName++) + ".mp3"));
out.write(bytes);
//刷新一下
out.flush();
//在里面关闭输出流,保证输出流在存储完1M之后关闭
out.close();
}
in.close();
}
//2.合并
private static void hebing() throws IOException {
//封装装有5个小音频的文件夹
File file1 = new File("F:\\音乐");
//获取文件
File[] files = file1.listFiles();
//new一个Vector集合,泛型定为字节输入流
Vector<FileInputStream> v = new Vector<>();
//遍历获取的文件
for (File f : files) {
//如果遍历的文件是文件类型且后缀名为.mp3,就new一个字节输出流将所有文件加入集合中
if (f.isFile()&&f.getName().endsWith(".mp3")){
FileInputStream inputStream = new FileInputStream(f);
v.add(inputStream);
}
}
//new一个顺序字节输入流SequenceInputStream,将集合中元素出传入流中
SequenceInputStream in = new SequenceInputStream(v.elements());
//new一个字节输出流,将合并后的文件路径与文件名定义好
FileOutputStream out = new FileOutputStream("F:\\新--夜夜夜夜.MP3");
//new一个缓冲区数组,这里的缓冲区是用来提升写入速度的,一般定义为8k,相当于一次存入8k
byte[] bytes = new byte[1024 * 8];
//定义一个标记
int len = 0;
//利用循环写入数据
while ((len=in.read(bytes))!=-1){
out.write(bytes);
//刷新
out.flush();![在这里插入图片描述](%5D%[email protected])
}
//关闭输入输出流
out.close();
in.close();
}
}
输出效果:
-------------拆分后:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190119213036657.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNDExNTUw,size_16,color_FFFFFF,t_70)
-------------合并后:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019011921291220.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNDExNTUw,size_16,color_FFFFFF,t_70)