前面说明了关于前端实现细节,下面我们来讲讲后端是如何实现的。
先理解一下如何实现前后台交互:前端发送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();
}
}