/*
* 需求:做一个音乐串烧
* 分析:
* 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) {// 构建序列流对两个音乐进行合并 SequenceInputStreamSequenceInputStream 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) {// 构建序列流对两个音乐进行合并 SequenceInputStreamSequenceInputStream 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) {// 构建序列流对两个音乐进行合并 SequenceInputStreamtry {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;}}}
}

关于Java之IO流音乐拼接小项目相关推荐

  1. Java基础IO流(二)字节流小案例

    JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...

  2. java基础 io流 字节流 字符流 节点流 包装流 转换流 缓冲流 对象流 打印流 Properties类

    目录 1.概念 2.常用的文件操作 2.1 创建文件 2.2 获取文件相关信息 2.3 目录的操作和文件删除 3. IO流原理及流的分类 3.1 流的分类 4.InputStream 字节输入流 4. ...

  3. Java基础—IO流

    第一讲   IO概述 1. 流的概念 IO流即InputOutput的缩写,在Java中IO流用来处理设备之间的数据传输,Java对数据的操作是通过IO流的方式, 我们可以把IO流抽象的当作一根管道, ...

  4. java数据通道抽象为流_【java】IO流

    对于java的IO流的理解很长时间来都是很乱,包括学习其他的语言对这一块知识也都算是一个盲点.更多的时候一提到读取保存数据就是使用数据库.这一次学习了IO流,自己又解决了一个很大的盲点. IO流为我们 ...

  5. java 的io流需要学吗_Java的IO流之字节流,必须要学得内容,你会嘛?

    原标题:Java的IO流之字节流,必须要学得内容,你会嘛? 伙伴们~ 端午节过的如何呀~ 有没有很开心呀~ 假期已过咱们继续开动了 IO流 先来认识一下IO流: IO流用来处理设备之间的数据传输,Ja ...

  6. 【Java】IO流 - 节点流和处理流【Buffered】

    ➤ Java 输入输出IO流 全部导航 文章目录 节点流和处理流 BufferedReader BufferedWriter Bufferd拷贝 BufferedInputStream/Buffere ...

  7. Java中IO流体系

    转载: https://mp.weixin.qq.com/s?__biz=MzA5NzgzODI5NA==&mid=2454030958&idx=1&sn=df27aadb92 ...

  8. 编码问题(Java的IO流为什么会有字节流和字符流)

    Java的IO流为什么会有字节流和字符流 首先明确字节流适用于任何场景,而且有字节缓冲流,能提高读取和输入的效率,也就是BufferedOutputStream/BufferedInputStream ...

  9. Java中IO流,输入输出流概述与总结(转载自别先生文章)

    Java中IO流,输入输出流概述与总结 总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都 ...

  10. JAVA基础 IO流技术学习笔记

    目录 一.IO 流技术介绍 1.1  什么是IO? 1.2  流的概念 1.3  数据源 1.3.1 什么是数据源? 1.3.2数据源的分类 二.第一个简单的IO流程序 三.IO流经典写法(适用于任何 ...

最新文章

  1. [置顶] 单例模式lua实现
  2. python语言特点有哪些-Python是什么?Python有什么特点?
  3. Qt把已有工程添加到其他工程中作为子工程或新创建子工程
  4. weblogic 11g 配置oracle数据源 数据库驱动选哪个,weblogic11g配置db2数据源驱动有关问题...
  5. 相机标定原理和opencv代码解析
  6. 天猫双11星秀猫官方周边开售 从设计到生产用时1个月
  7. 重温Javascript继承机制
  8. javascript 数组去重 unique
  9. HDOJ 1394 Minimum Inversion Number(线段树求逆序数对)
  10. SQL 数据表基本操作
  11. PHP 微信网页授权开发
  12. 日版iphone5 SB 配合REBELiOS卡贴破解电信3G步骤
  13. ubuntu更新pip
  14. Shiro系列(一)——Shiro + Springboot + JWT 整合
  15. Android 模拟器(window/Mac)
  16. vscode配置c语言并优化
  17. 【译】将字符转换为双精度浮点型
  18. 损失函数-交叉熵的推导和二分类交叉熵
  19. wps文档漫游删除_WPS自带的文档漫游和在线模板怎么关闭?
  20. 什么是语言?什么是自然语言?

热门文章

  1. web网页简繁汉字转换
  2. 最大化参数 火车头_新手必看的火车头采集器使用入门教程_图文解说版!(看完包会)...
  3. 10+必备的 WORDPRESS 常用插件
  4. 文本编辑器——VI/VIM
  5. 推荐这5款Windows软件,一款比一款惊喜
  6. 【ESRI论坛6周年征文】ArcEngine注记(Anno/ Label/Element等)处理专题 -入门篇
  7. java socket是什么_Java网络编程-JavaSocket编程是什么呢?
  8. JVisualVM监控jvm
  9. python 规则引擎 drools_Drools 规则引擎环境搭建
  10. 下载谷歌云盘大型文件(15G)