js+java后台 基于开源项目上实现web端音频可视化(three.js)(二)

本文介绍了一种使用Java原生Servlet实现后台动态播放列表的方法。通过读取音频文件目录,生成播放列表,并在播放完一首歌后删除列表中的第一条数据,回写到文件,以实现列表更新。此外,还讨论了如何通过监听音频文件目录变化或HTTP请求动态添加新歌曲到播放列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面说明了关于前端实现细节,下面我们来讲讲后端是如何实现的。

先理解一下如何实现前后台交互:前端发送get请求到后台后,后台发送音频文件路径,前端就知道这些文件存放在哪里了。而这些音频文件都存在一个目录中。

因为需要实现列表播放,我的做法是用java读取一个文件目录的所有文件名称

 public  void Init()
    {
        String[]  dirarr;
         PrintWriter out=null;
        try{
        //将所读取到的音频文件名称都写入到一个文件中,
        //简单的播放列表就实现了
            File musiclist=new File(Constants.MUSICLIST);
      
            if (!musiclist.exists()){//若此目录不存在,则创建之// 这个东西只能简历一级文件夹,两级是无法建立的。。。。。
                musiclist.createNewFile();
                System.out.println("spot a new file"+musiclist.getPath());
            }
			
            out = new PrintWriter(new BufferedOutputStream(
                    new FileOutputStream(Constants.MUSICLIST)));
                    //1.读取音频存放的目录
            File musicfile=new File(Constants.MUSICPATH);
            //2.file的list方法,能够将该目录下所有文件名称放到一个数组
            dirarr=musicfile.list();

            if(dirarr!=null)
            for(int i=0;i<dirarr.length;i++)
            {
            //3.放到musiclist文件中
                out.println("\\musicplay\\"+dirarr[i]);
            //    System.out.println(dirarr[i]);
            }
        }catch (IOException e)
        {
            System.out.println("Filestore program error");
            e.printStackTrace();
        }finally {
            if(out!=null)out.close();
            System.out.println("FileStore finished");
        }
    }

实现效果如下:

在这里插入图片描述
然后再来说说配置后台吧。
由于博主没有学过java框架,所用的都是原生底层servlet。

由于博主的初衷是希望播放列表能够进行随时添加删除播放歌曲的,而文件是没有删除指定第几行数据的操作的,所以这里所用的思路是:
1.首先读取列表文件到一个数组中

2.每次发送文件的第一条歌曲路径到前端后就把数组的第一个元素给删除

3.删除完后再回写到列表文件中(覆盖)

这样就实现了播放列表功能,然后播放完全部歌曲后,再重新读取存放音乐目录。

这样做的好处就是,能够动态实现播放列表的更新,当然还需要实现添加音乐,这里可以通过监听音频文件目录变化的程序来实现,当文件出现变化(添加新歌曲),就将出现的新音频文件名称添加到列表文件结尾。

又或者,可以通过http请求传输音频文件到后台,后台将其存储到音频文件目录后同时在列表文件追加该歌曲(写到播放列表最后面)。(这个功能跟后面的上传录音文件的实现是一样的)

//SendNextMusic.java
//httpServlet
@WebServlet(urlPatterns = "/music")
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        File musiclist = new File(Constants.MUSICLIST);
        File recordlist=new File(Constants.RECORDLIST);
        BufferedReader bufferedReader =null;
        PrintWriter out = null;
        ArrayList<String> list =null;
        PrintWriter pw =null;
        try{
        	if (musiclist.exists() && !(musiclist.exists() && musiclist.length() == 0)) 
        	{
                	bufferedReader=new BufferedReader(new InputStreamReader
                        (new FileInputStream(Constants.MUSICLIST)));
                	String str = null;
                	//1.首先读取列表文件到一个数组中
                	list = new ArrayList<>();
                	while ((str = bufferedReader.readLine()) != null) 
                	{	list.add(str); }
                	//发送music路径
                	out = resp.getWriter();
                	if (list.get(0) != null) out.println(list.get(0));
                	/*2.每次发送文件的第一条歌曲路径到前端后
                	就把数组的第一个元素给删除*/
                	list.remove(0);
                	pw = new PrintWriter(new BufferedWriter(
                	  	new OutputStreamWriter(
                        new FileOutputStream(Constants.MUSICLIST))));
                	if (list.size() != 0)
                	//3.删除完后再回写到列表文件中(覆盖)
                    for (String string : list) {
                        pw.println(string);
                    }
                else if (list.size() == 0) {
                    pw.write("");
                    System.out.println("music has played completely");
             }
             else 
             {
                //文件已经读到结尾,则进行初始化
                FileStore fs=new FileStore();
                fs.Init();
             }
           }catch (IOException e)
        {
            e.printStackTrace();
            System.out.println("program sendnextmusic has exception");
        }
        finally{
                if(out!=null) out.close();
                if(bufferedReader!=null) bufferedReader.close();
                if(pw!=null) pw.close();
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值