关于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
原创粉丝点击