需求:把一首音乐分成几段,然后再把切割好的音乐再合并成为原音乐
代码实现:
public static void main(String[] args) throws IOException{
cutMusic();
mergeMusic();
}
//切割音乐文件
public static void cutMusic() throws IOException{
//找到原本的音乐文件的路径
File file = new File("D:/daskp/music/丫头.mp3");
//把切割 之后的 多个音乐文件 放入这个 文件夹路径中
File dirFile = new File("D:/user/music");
//建立数据连接的通道
//输入流 读取本地音乐文件 然后 写出的时候写成多个文件
FileInputStream input = new FileInputStream(file);
//读取数据
int length = 0;
//1兆一个音乐文件
byte[] buff = new byte[1024*1024];
for(int i = 1; (length = input.read(buff)) != -1; i++){
// part1.mp3, part2.mp3, part3.mp3 ...
File outFile = new File(dirFile, "part"+i +".mp3");FileOutputStream output = new FileOutputStream(outFile);
//让输出流 写入数据
//一个输出流 写入一个数据到 parti.mp3文件
output.write(buff, 0, length);
//关闭资源
output.close();
}
//关闭输入流资源
input.close();
}
//合并音乐文件
public static void mergeMusic() throws IOException{
//找到目标文件
//父路径
File dirFile = new File("D:/user/music");
//2.创建Vector集合的对象,把输入流放进去
Vector<FileInputStream> v = new Vector<FileInputStream>();
File[] filesArr = dirFile.listFiles();
//遍历这个文件数组,然后往Vector中添加元素
for(File file : filesArr){
//只创建 mp3文件的输入流对象, 放入到集合中
if(file.getName().endsWith(".mp3")){
FileInputStream input = new FileInputStream(file);
v.add(input);
}
}
Enumeration<FileInputStream> e = v.elements();
//创建序列流对象
SequenceInputStream sequenceStream = new SequenceInputStream(e);
//创建写入的 文件流 输出流
FileOutputStream output = new FileOutputStream("D:/user/music/丫头合并版.mp3");
//读取序列流中的数据
int length = 0;
byte[] b = new byte[1024*1024];
while((length = sequenceStream.read(b)) != -1){
output.write(b, 0, length);
}
output.close();
sequenceStream.close();
}