关于Java之IO流音乐拼接小项目
/*
* 需求:做一个音乐串烧
* 分析:
* 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流音乐拼接小项目相关推荐
- Java基础IO流(二)字节流小案例
JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...
- java基础 io流 字节流 字符流 节点流 包装流 转换流 缓冲流 对象流 打印流 Properties类
目录 1.概念 2.常用的文件操作 2.1 创建文件 2.2 获取文件相关信息 2.3 目录的操作和文件删除 3. IO流原理及流的分类 3.1 流的分类 4.InputStream 字节输入流 4. ...
- Java基础—IO流
第一讲 IO概述 1. 流的概念 IO流即InputOutput的缩写,在Java中IO流用来处理设备之间的数据传输,Java对数据的操作是通过IO流的方式, 我们可以把IO流抽象的当作一根管道, ...
- java数据通道抽象为流_【java】IO流
对于java的IO流的理解很长时间来都是很乱,包括学习其他的语言对这一块知识也都算是一个盲点.更多的时候一提到读取保存数据就是使用数据库.这一次学习了IO流,自己又解决了一个很大的盲点. IO流为我们 ...
- java 的io流需要学吗_Java的IO流之字节流,必须要学得内容,你会嘛?
原标题:Java的IO流之字节流,必须要学得内容,你会嘛? 伙伴们~ 端午节过的如何呀~ 有没有很开心呀~ 假期已过咱们继续开动了 IO流 先来认识一下IO流: IO流用来处理设备之间的数据传输,Ja ...
- 【Java】IO流 - 节点流和处理流【Buffered】
➤ Java 输入输出IO流 全部导航 文章目录 节点流和处理流 BufferedReader BufferedWriter Bufferd拷贝 BufferedInputStream/Buffere ...
- Java中IO流体系
转载: https://mp.weixin.qq.com/s?__biz=MzA5NzgzODI5NA==&mid=2454030958&idx=1&sn=df27aadb92 ...
- 编码问题(Java的IO流为什么会有字节流和字符流)
Java的IO流为什么会有字节流和字符流 首先明确字节流适用于任何场景,而且有字节缓冲流,能提高读取和输入的效率,也就是BufferedOutputStream/BufferedInputStream ...
- Java中IO流,输入输出流概述与总结(转载自别先生文章)
Java中IO流,输入输出流概述与总结 总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都 ...
- JAVA基础 IO流技术学习笔记
目录 一.IO 流技术介绍 1.1 什么是IO? 1.2 流的概念 1.3 数据源 1.3.1 什么是数据源? 1.3.2数据源的分类 二.第一个简单的IO流程序 三.IO流经典写法(适用于任何 ...
最新文章
- [置顶] 单例模式lua实现
- python语言特点有哪些-Python是什么?Python有什么特点?
- Qt把已有工程添加到其他工程中作为子工程或新创建子工程
- weblogic 11g 配置oracle数据源 数据库驱动选哪个,weblogic11g配置db2数据源驱动有关问题...
- 相机标定原理和opencv代码解析
- 天猫双11星秀猫官方周边开售 从设计到生产用时1个月
- 重温Javascript继承机制
- javascript 数组去重 unique
- HDOJ 1394 Minimum Inversion Number(线段树求逆序数对)
- SQL 数据表基本操作
- PHP 微信网页授权开发
- 日版iphone5 SB 配合REBELiOS卡贴破解电信3G步骤
- ubuntu更新pip
- Shiro系列(一)——Shiro + Springboot + JWT 整合
- Android 模拟器(window/Mac)
- vscode配置c语言并优化
- 【译】将字符转换为双精度浮点型
- 损失函数-交叉熵的推导和二分类交叉熵
- wps文档漫游删除_WPS自带的文档漫游和在线模板怎么关闭?
- 什么是语言?什么是自然语言?
热门文章
- web网页简繁汉字转换
- 最大化参数 火车头_新手必看的火车头采集器使用入门教程_图文解说版!(看完包会)...
- 10+必备的 WORDPRESS 常用插件
- 文本编辑器——VI/VIM
- 推荐这5款Windows软件,一款比一款惊喜
- 【ESRI论坛6周年征文】ArcEngine注记(Anno/ Label/Element等)处理专题 -入门篇
- java socket是什么_Java网络编程-JavaSocket编程是什么呢?
- JVisualVM监控jvm
- python 规则引擎 drools_Drools 规则引擎环境搭建
- 下载谷歌云盘大型文件(15G)