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

2023-05-16

/*
* 需求:做一个音乐串烧
* 分析:
* 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;
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于Java之IO流音乐拼接小项目 的相关文章

  • 如何使用 UnboundID LDAP SDK 获取 LDAP 中的 DN 和用户 ID

    当我唯一的参数是用户 ID 时 我试图获取用户的 DN 可能不止一个 我还使用 UnboundID LDap SDK 如您所见 public String getCustomerAdminDN String uid String resul
  • 文件写入器覆盖文件而不是附加到末尾时出现问题

    好的 我在将多行写入文本文件时遇到一些问题 程序运行 但不会每次都使用新行 当我希望它运行 4 次时 文本文件应如下所示 a b c d 相反 它看起来像 d 谁知道如何解决这个问题 所有导入均正确导入 来源 已稍加编辑 假设一切都已正确定
  • Java 中具有级别顺序插入的完整二叉搜索树

    我们接到一个任务 需要编码 二叉搜索树 那个树has to be complete not perfect 这意味着所有不在最低级别或次低级别的节点都应该有 2 个子节点 而最低级别的节点应尽可能远离左侧 我们需要插入到树中等级顺序 所以如
  • 为 Nimbus 外观设计简单的单元渲染器

    我有一个简单的单元格渲染器 它由一些组成JLabels 渲染器本身扩展JPanel 并且我正在尝试让它在 Nimbus 的外观和感觉中合理地渲染 基本上发生的事情是在lighter行 正如 Nimbus 所具有的交替行着色 我的特定单元格渲
  • log4j2 SMTP Appender:如何包含另一个级别的先前消息?

    我正在使用 log4j2 beta9 并且有以下配置 其中一部分
  • 在 Spring 中使用事务时创建提交后

    由于某些原因 我使用 Spring PlatformTransactionManager 手动执行事务提交和回滚 我需要做的是设置一个钩子 以便在提交事务后发生提交后操作 通过查看 void commit TransactionStatus
  • 可以使用注解进行代码注入吗?

    我意识到这可能是一个已经被提出和回答的问题 但请耐心等待 我想知道是否可以使用注释将代码注入到类编译时 典型的示例是为对象的成员生成 getter 和 setter 这并不完全是我所需要的 但它可以说明基本思想 现在在互联网上我得到的基本答
  • 如何设置Java线程的CPU核心亲和力?

    我搜索了以前关于类似主题的帖子 但找不到合适的答案 因此提出这个问题 非常感谢您帮助回答 我知道在 Linux 中通过任务集命令设置进程与特定 CPU 核心的关联性 但我想设置 Java 线程与特定 cpu 核心的亲和力 以便属于同一进程的
  • Java Swing 自定义形状(2D 图形)

    我需要绘制自定义形状 现在 当用户单击面板上的几个点时 我使用多边形创建一个形状 public void mouseClicked MouseEvent e polygon addPoint e getX e getY repaint 但我
  • 如何将多个值存储到一个键(java)

    我搜索一个可以存储多个键值对的数据结构 数据基本上是这样的 1 value 1 2 value 2 于是我想到了使用HashMap 遗憾的是 这对我不起作用 因为一个键可能会出现多个值 在上面的例子中 1 value 2 可能是另一个条目
  • 如何从网上获取源代码?

    我正在尝试从 Web 获取 HTML 源代码 我尝试这样做 u new URL url URLConnection con u openConnection con setRequestProperty User Agent Mozilla
  • Java SSO 与 Wildfly 8、Java 1.8.0_45 和 Active Directory

    我对这个主题进行了很多搜索 但找不到解决方案 要求的简短描述 Wildfly 8 2 下 Web 应用程序上的 SSO 在 Active Directory 中验证 Windows 用户的身份 当 SSO 失败时回退到登录表单 在 Wild
  • 从两个数组中查找公共文件

    我正在尝试从两个数组中查找通用名称文件 我已将两个不同文件夹的文件名保存在两个不同的数组中 现在我正在创建一个通用文件数组 其中包含具有通用名称的文件 filenames 1 包含文件夹 1 中文件名称的数组 filename2 包含文件夹
  • c3p0 Java 数据库池、故障转移配置

    当数据库关闭时 IP 和端口会自动切换到另一个数据库服务器 我应该如何配置 Web 应用程序的 c3p0 连接池以遵循此数据库故障转移机制 目前 我使用的是 c3p0 但是在上次数据库故障转移中 池连接无法重新建立 请求失败后重新建立 有助
  • 调用本机方法时返回 java.lang.UnsatisfiedLinkError

    我正在尝试为第三方 DLL 制作 Java 包装器 我创建了自己的 DLL 充当 JNI 和第三方 DLL 之间的中间人 在java中我加载这个DLL很好但是错误java lang UnsatisfiedLinkError sixense
  • Spring Hibernate中的@Transient方法调用

    我有一个 Pojo 类 在其中创建一个未与数据库表映射的字段 所以我必须声明字段Declaration和setter和getter方法 Transient 否则会显示错误 Transient private String docHistor
  • 用 Java 编写“漂亮”代码的标准? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Xuggler 未转换 .webm 文件?

    我只是尝试使用 Xuggler 将 mov 文件转换为 webm 这应该可以工作 因为 FFMPEG 支持 webm 文件 这是我的代码 IMediaReader reader ToolFactory makeReader home use
  • Spring MVC 和复选框

    我正在使用 Spring MVC 3 0 并且不能完全看到这个问题的所有部分 我的控制器将生成一个域对象列表 假设有一个简单的 User 对象 具有firstName lastName age 和role 属性 我想在表中输出该用户列表 每
  • 无法以联觉方式绘制像素、Pi 数

    我想将 pi 数字的每个数字打印为彩色像素 因此 我得到一个带有 pi 数字的输入 然后将其解析为一个列表 每个节点包含一个数字 我知道 稍后我将使用一个数组 但我从来没有把它画到屏幕上 有人能帮我看看我错在哪里吗 import java

随机推荐