关于Java之IO流音乐拼接小项目
来源:互联网 发布:linux系统管理员薪水 编辑:程序博客网 时间:2024/06/05 01:11
/*
* 需求:做一个音乐串烧
* 分析:
* 1. 有n个音乐,找到高潮部分,
* 2. 获取高潮部分的流对象
* 3. 把这部分对象保存成一个mp3
* 4. 把它们拼接起来
* */
以下为源码供大家分享:
方法一:import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.SequenceInputStream;import java.util.Scanner;public class SpecialMedlyTest { public static void main(String[] args) { SpecialMedlyTest.musicMenu(); } // 截取音乐高潮部分 public static void musicMenu() { boolean flag = true; //判断是否退出程序 //while循环可实现N个音乐拼接的操作 while(true && flag){ //以下只是拼接2个音乐的拼接 Scanner sc = new Scanner(System.in); System.out.println("请输入第一个歌曲的路径:"); File f1 = getFile(sc); System.out.println("请输入第二个歌曲的路径:"); File f2 = getFile(sc); System.out.println("请输入音乐串烧后的音乐路径(格式:文件路径,文件名):"); File f3 = found(sc); specialMedly(f1, f2, f3); System.out.println("是否继续拼接音乐?(Y or N):"); String string = sc.nextLine(); if(string.equalsIgnoreCase("Y")){ flag = true; }else if(string.equalsIgnoreCase("N")){ flag = false; System.out.println("你选择退出了程序..."); break; }else{ System.out.println("输入有误!程序正在自动退出..."); break; } } } // 合并音乐,构成音乐串烧 @SuppressWarnings("resource") public static void specialMedly(File f1, File f2, File f3) { // 构建序列流对两个音乐进行合并 SequenceInputStream SequenceInputStream sis = null; // 构建缓冲输出流进行创建新歌曲路径 BufferedOutputStream bos = null; try { sis = new SequenceInputStream(new FileInputStream(f1), new FileInputStream(f2)); bos = new BufferedOutputStream(new FileOutputStream(f3)); // 复制流到新文件中 byte[] b = new byte[512]; int len = 0; try { while ((len = sis.read(b)) != -1) { bos.write(b, 0, len); } } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { // 关闭流操作 try { if (sis != null) sis.close(); if (bos != null) bos.close(); } catch (IOException e) { e.printStackTrace(); } } } // 获取输出路径 public static File found(Scanner sc) { // File(String parent,String child)方法 [parent-父路径名字符串 ;child-子路径名字符串] String str = sc.nextLine(); // 对输入进来的路径进行分离 String[] s = str.split(","); // 判断父路径名字符串是否存在 File f1 = new File(s[0]); if (!f1.exists()) { f1.mkdirs(); } // 创建一个新的输入路径 File f2 = new File(s[0], s[1]); if (!f2.exists()) { try { f2.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } return f2; } // 获取音乐路径 public static File getFile(Scanner sc) { while (true) { File file = new File(sc.nextLine()); if (!file.exists()) { System.out.println("你输入的文件不存在!请重新输入..."); } else if (file.isDirectory()) { System.out.println("你输入的是文件夹,输入有误!"); } else { return file; } } }}
方法二:import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.SequenceInputStream;import java.util.Scanner;/* *个人推荐使用这种方法! * */public class SpecialMedlyTest2 { public static void main(String[] args) { // while循环可实现N个音乐拼接的操作 SequenceInputStream sis = null; // 以下只是拼接2个音乐的拼接 Scanner sc = new Scanner(System.in); System.out.println("请输入第一个歌曲的路径:"); File f1 = getFile(sc); System.out.println("请输入第二个歌曲的路径:"); File f2 = getFile(sc); // 合并流 (这里一定要给sis赋值) sis = mergeFile(f1, f2); //boolean flag = true; // 判断是否退出程序 while (true) { System.out.println("是否继续增加音乐?(Y or N):"); String string = sc.nextLine(); if (string.equalsIgnoreCase("Y")) { System.out.println("请输入歌曲的路径:"); File f = getFile(sc); //这里相当于对上面的sis进行了递归,进而实现了N个音乐的拼接 sis = mergeFile(sis, f); //continue; } else if (string.equalsIgnoreCase("N")) { System.out.println("你选择了不再添加音乐..."); break; } else { System.out.println("输入有误!程序正在合并之前正确的文件..."); break; } } System.out.println("请输入音乐串烧后的音乐路径(格式:文件路径,文件名):"); File f3 = found(sc); // 合并音乐 specialMedly(sis, f3); } // 合并流文件,返回SequenceInputStream对象 [File,File] (类似于管道流) @SuppressWarnings("resource") public static SequenceInputStream mergeFile(File f1, File f2) { // 构建序列流对两个音乐进行合并 SequenceInputStream SequenceInputStream sis = null; try { sis = new SequenceInputStream(new FileInputStream(f1), new FileInputStream(f2)); } catch (IOException e) { e.printStackTrace(); } return sis; } // 合并流文件,返回SequenceInputStream对象 [SequenceInputStream,File](类似于管道流) @SuppressWarnings("resource") public static SequenceInputStream mergeFile(SequenceInputStream sis, File f) { // 构建序列流对两个音乐进行合并 SequenceInputStream try { sis = new SequenceInputStream(sis, new FileInputStream(f)); } catch (FileNotFoundException e) { e.printStackTrace(); } return sis; } // 合并音乐,构成音乐串烧 public static void specialMedly(SequenceInputStream sis, File f3) { // 构建缓冲输出流进行创建新歌曲路径 BufferedOutputStream bos = null; try { bos = new BufferedOutputStream(new FileOutputStream(f3)); // 复制流到新文件中 byte[] b = new byte[512]; int len = 0; try { while ((len = sis.read(b)) != -1) { bos.write(b, 0, len); } } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { // 关闭流操作 try { if (sis != null) sis.close(); if (bos != null) bos.close(); } catch (IOException e) { e.printStackTrace(); } } } // 获取输出路径 public static File found(Scanner sc) { // File(String parent,String child)方法 [parent-父路径名字符串 ;child-子路径名字符串] String str = sc.nextLine(); // 对输入进来的路径进行分离 String[] s = str.split(","); // 判断父路径名字符串是否存在 File f1 = new File(s[0]); if (!f1.exists()) { f1.mkdirs(); } // 创建一个新的输入路径 File f2 = new File(s[0], s[1]); if (!f2.exists()) { try { f2.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } return f2; } // 获取音乐路径 public static File getFile(Scanner sc) { while (true) { File file = new File(sc.nextLine()); if (!file.exists()) { System.out.println("你输入的文件不存在!请重新输入..."); } else if (file.isDirectory()) { System.out.println("你输入的是文件夹,输入有误!"); } else { return file; } } }}
0 0
- 关于Java之IO流音乐拼接小项目
- Java小专题之IO
- java小项目之管家婆
- 关于java多条件查询SQL语句拼接的小技巧
- java io小案例
- 老生常谈之Java字符串拼接
- 小强的java练级记之IO
- Java基础之练手小项目
- java小项目之用户信息添加
- java小项目之文本编辑器
- 关于两表之拼接,去重
- Java中关于字符串拼接的问题
- 关于java.io.NoSerializable
- 关于java io学习
- 关于Java IO
- 关于java io 流
- 关于 java.io.OptionalDataException
- 关于java IO流
- ServerSocket的使用
- 设计模式之八:中介者模式
- AndroidStudio 类成员变量规范设置
- 字符串——变位词判断
- Linux中系统管理中常用命令
- 关于Java之IO流音乐拼接小项目
- phpstudy安装imagick扩展库怎么装
- [SMOJ1785]修复道路
- html标签属性
- html和css
- typedef 定义函数指针
- 使用Docker部署 spring-boot maven应用
- MQTT 要点: Part 1 – MQTT介绍
- 僵尸进程和孤儿进程