8 导出歌单功能问题

8 导出歌单功能问题

package com.zzh.player;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class TestDemo {

	// 歌曲类Song测试
	public static void testSong() {
		Song song1 = new Song("s001", "两只老虎", "小太阳合唱团");
		Song song2 = new Song("s002", "小燕子", "风车合唱团");
		Song song3 = new Song("s003", "茉莉花", "彩虹合唱团");
		Song song4 = new Song("s003", "茉莉花", "彩虹合唱团");
		System.out.println(song1.toString());
		System.out.println("song1==song3?" + (song1).equals(song3));
		System.out.println("song1==song3?" + (song3).equals(song4));
	}

	// 播放列表类playList测试
	public static void testPlayList() {
		Song song1 = new Song("s001", "两只老虎", "小太阳合唱团");
		Song song2 = new Song("s002", "小燕子", "风车合唱团");
		Song song3 = new Song("s003", "茉莉花", "彩虹合唱团");
		Song song4 = new Song("s003", "茉莉花", "彩虹合唱团");
		// 创建播放列表对象
		PlayList mainPlayList = new PlayList("主播放列表");
		mainPlayList.addToPlayList(song1);
		mainPlayList.addToPlayList(song2);
		mainPlayList.addToPlayList(song3);
		mainPlayList.addToPlayList(song4);
		// 显示播放列表的内容
		mainPlayList.displayAllSong();
		// 通过id查询歌曲信息
		Song songTest1 = mainPlayList.searchSongById("s003");
		if (songTest1 != null) {
			System.out.println("根据id查询的歌曲信息为:");
			System.out.println(songTest1);
		} else {
			System.out.println("该歌曲不存在");
		}
		// 通过name查询歌曲信息
		Song songTest2 = mainPlayList.searchSongByName("茉莉花");
		if (songTest2 != null) {
			System.out.println("根据name查询的歌曲信息为:");
			System.out.println(songTest2);
		} else {
			System.out.println("该歌曲不存在");
		}
		// 修改歌曲信息
		Song songUpdate = new Song("s005", "蜗牛与黄鹂鸟", "小太阳");
		mainPlayList.updateSong("s003", songUpdate);
		mainPlayList.displayAllSong();
		// 删除歌曲信息
		mainPlayList.deleteSong("s005");
		mainPlayList.displayAllSong();
	}

	// 测试播放列表集合类
	public static void testPlayListCollection() {
		Song song1 = new Song("s001", "两只老虎", "小太阳合唱团");
		Song song2 = new Song("s002", "小燕子", "风车合唱团");
		Song song3 = new Song("s003", "茉莉花", "彩虹合唱团");
		// 创建主播放列表
		PlayList mainPlayList = new PlayList("主播放列表");
		// 将歌曲添加到主播放列表中
		mainPlayList.addToPlayList(song1);
		mainPlayList.addToPlayList(song2);
		mainPlayList.addToPlayList(song3);
		mainPlayList.displayAllSong();
		// 创建新播放列表,从主播放列表中添加歌曲
		PlayList favoritePlayList = new PlayList("最喜欢的歌曲");
		favoritePlayList.addToPlayList(mainPlayList.getMusicList().get(0));
		favoritePlayList.addToPlayList(mainPlayList.getMusicList().get(1));
		favoritePlayList.addToPlayList(mainPlayList.getMusicList().get(2));
		favoritePlayList.displayAllSong();
		// 将两个播放列表添加到播放列表集合中
		PlayListCollection plc = new PlayListCollection();
		plc.addPlayList(mainPlayList);
		plc.addPlayList(favoritePlayList);
		plc.displayPlayListName();
		// 根据播放列表名称查询播放列表信息,并显示所有歌曲
		PlayList playList = null;
		playList = plc.searchPlayListByName("最喜欢的歌曲");
		playList.displayAllSong();
		// 删除播放列表信息
		System.out.println("删除前");
		plc.displayPlayListName();
		System.out.println("删除后");
		plc.deletePlayList(favoritePlayList);
		plc.displayPlayListName();
	}

	// 主菜单
	public void mainMenu() {
		System.out.println("*******************************");
		System.out.println("           **主菜单**          ");
		System.out.println("         1-播放列表管理        ");
		System.out.println("         2-播放器管理        ");
		System.out.println("         0-退出        ");
		System.out.println("*******************************");
	}

	// 播放列表管理菜单
	public void playListMenu() {
		System.out.println("*******************************");
		System.out.println("      **播放列表管理菜单**     ");
		System.out.println("     1-将歌曲添加到主播放列表        ");
		System.out.println("     2-将歌曲添加到其他播放列表        ");
		System.out.println("     3-通过歌曲id查询播放列表歌曲        ");
		System.out.println("     4-通过歌曲名称查询播放列表歌曲        ");
		System.out.println("     5-修改播放列表中的歌曲        ");
		System.out.println("     6-删除播放列表中的歌曲        ");
		System.out.println("     7-显示播放列表中的所有歌曲        ");
		System.out.println("     8-导出歌单        ");
		System.out.println("     9-返回上一级菜单        ");
		System.out.println("*******************************");
	}

	// 播放器管理菜单
	public void playerMenu() {
		System.out.println("*******************************");
		System.out.println("      **播放器管理菜单**     ");
		System.out.println("     1-向播放器添加播放列表");
		System.out.println("     2-从播放器删除播放列表        ");
		System.out.println("     3-通过名称查询播放列表信息        ");
		System.out.println("     4-显示所有播放列表名称        ");
		System.out.println("     9-返回上一级菜单        ");
		System.out.println("*******************************");
	}

	// 主流程
	public void test() {
		TestDemo td = new TestDemo();
		Scanner sc = new Scanner(System.in);
		int input = 0, input1 = 0, input2 = 0;
		FileOutputStream fos=null;
		ObjectOutputStream oos=null;
		FileInputStream fis=null;
		ObjectInputStream ois=null;
		//创建一个播放列表容器(播放器)
		PlayListCollection plc=new PlayListCollection();
		//创建主播放列表
		PlayList mainPlayList=new PlayList("主播放列表");
		//将主播放列表添加到播放器中
		plc.addPlayList(mainPlayList);
		PlayList favoritePlayList=null;
		while (true) {
			td.mainMenu();
			System.out.println("请输入对应数字进行操作:");
			input = sc.nextInt();
			if (input == 0) {
				System.out.println("退出程序");
				break;
			}
			switch (input) {
			case 1:
				// 播放列表管理
				while (true) {
					td.playListMenu();
					System.out.println("请选择数字进行播放列表管理:");
					input1 = sc.nextInt();
					if (input1 == 9) {
						break;
					}

					switch (input1) {
					case 1:
						System.out.println("将歌曲添加到主播放列表");
						System.out.println("请输入要添加歌曲的数量:");
						int count=sc.nextInt();
						for(int i=0;i<count;i++) {
							System.out.println("请输入第"+(i+1)+"首歌曲:");
							System.out.println("请输入歌曲的id:");
							String strId=sc.next();
							System.out.println("请输入歌曲的名称:");
							String strName=sc.next();
							System.out.println("请输入演唱者:");
							String strSinger=sc.next();
							//创建歌曲类对象
							Song song=new Song(strId,strName,strSinger);
							mainPlayList.addToPlayList(song);
						}
//						mainPlayList.displayAllSong();
						break;
					case 2:
						System.out.println("将歌曲添加到其他播放列表");
						System.out.println("请输入要添加的播放列表名称:");
						String strName=sc.next();
						//判断播放列表名称是否存在
						favoritePlayList=plc.searchPlayListByName(strName);
						if(favoritePlayList==null) {
							System.out.println("该播放列表不存在,请先将播放列表添加到播放器中");
						}else {
							System.out.println("请输入要添加的歌曲数量:");
							int count1=sc.nextInt();
							for(int i=0;i<count1;i++) {
								System.out.println("请输入第"+(i+1)+"首歌曲的id:");
								String strId1=sc.next();
								//首先判断该id是否在主播放列表中是否存在
								Song song=mainPlayList.searchSongById(strId1);
								if(song==null) {
									System.out.println("该歌曲在主播放列表不存在,继续输入歌曲其他信息");
									System.out.println("请输入歌曲名称:");
									String strName1=sc.next();
									System.out.println("请输入演唱者:");
									String strSinger1=sc.next();
									song=new Song(strId1,strName1,strSinger1);
									mainPlayList.addToPlayList(song);
									favoritePlayList.addToPlayList(song);
								}else {
									favoritePlayList.addToPlayList(song);
								}
							}
							//显示播放列表中的歌曲信息
//							mainPlayList.displayAllSong();
//							favoritePlayList.displayAllSong();
						}
						break;
					case 3:
						System.out.println("通过歌曲id查询播放列表歌曲");
						System.out.println("请输入要查询的播放列表名称:");
						String strPlayListName=sc.next();
						//查询播放列表是否存在
						PlayList pl=plc.searchPlayListByName(strPlayListName);
						if(pl==null) {
							System.out.println("该播放列表不存在!");
							break;
						}else {
							System.out.println("请输入要查询的歌曲id");
							String strId=sc.next();
							Song song=pl.searchSongById(strId);
							if(song==null) {
								System.out.println("该歌曲在播放列表"+strPlayListName+"中不存在");
							}else {
								System.out.println("该歌曲的信息为:");
								System.out.println(song);
							}
						}
						break;
					case 4:
						System.out.println("通过歌曲名称查询播放列表歌曲");
						System.out.println("请输入要查询的播放列表名称:");
						String strPlayListName1=sc.next();
						//查询播放列表是否存在
						PlayList pl1=plc.searchPlayListByName(strPlayListName1);
						if(pl1==null) {
							System.out.println("该播放列表不存在!");
							break;
						}else {
							System.out.println("请输入要查询的歌曲名称");
							String strName1=sc.next();
							Song song=pl1.searchSongByName(strName1);
							if(song==null) {
								System.out.println("该歌曲在播放列表"+strPlayListName1+"中不存在");
							}else {
								System.out.println("该歌曲的信息为:");
								System.out.println(song);
							}
						}
						break;
					case 5:
						System.out.println("修改播放列表中的歌曲");
						System.out.println("请输入要修改歌曲所在的播放列表");
						String playListName=sc.next();
						PlayList playList=plc.searchPlayListByName(playListName);
						if(playList==null) {
							System.out.println("该播放列表不存在");
							break;
						}
						System.out.println("请输入要修改的歌曲id");
						String id=sc.next();
						Song song=playList.searchSongById(id);
						if(song==null) {
							System.out.println("要修改的歌曲不存在!");
							break;
						}else {
							System.out.println("请输入更新的歌曲名称");
							String name=sc.next();
							System.out.println("请输入更新的歌曲演唱者");
							String singer=sc.next();
							song=new Song(id,name,singer);
							playList.updateSong(id, song);
						}
						break;
					case 6:
						System.out.println("删除播放列表中的歌曲");
						System.out.println("请输入要删除的歌曲id");
						String id1=sc.next();
						Map<String,PlayList> playListMap=plc.getPlayListMap();
						Set<Map.Entry<String,PlayList>> playListSet=playListMap.entrySet();
						Iterator<Map.Entry<String,PlayList>> it=playListSet.iterator();
						while(it.hasNext()) {
							Map.Entry<String,PlayList> entry=it.next();
							entry.getValue().deleteSong(id1);
						}
						break;
					case 7:
						System.out.println("显示播放列表中的所有歌曲");
						System.out.println("请输入要查询的播放列表名称");
						String playListName1=sc.next();
						PlayList playList1=plc.searchPlayListByName(playListName1);
						if(playList1==null) {
							System.out.println("该播放列表不存在");
							break;
						}else {
							playList1.displayAllSong();
						}
						break;
					case 8:
						System.out.println("导出歌单");
						System.out.println("请输入要导出的播放列表名称");
						String playListName2=sc.next();
						PlayList playList2=plc.searchPlayListByName(playListName2);
						if(playList2==null) {
							System.out.println("该播放列表不存在");
							break;
						}
						try {
							//导出歌单存储信息
							fos=new FileOutputStream(playListName2+".txt");
							oos=new ObjectOutputStream(fos);
							oos.writeObject(playList2);
							oos.flush();
							fos.close();
							oos.close();
							//读取歌单信息
							fis=new FileInputStream(playListName2+".txt");
							ois=new ObjectInputStream(fis);
							PlayList playList3=(PlayList)ois.readObject();
							playList3.displayAllSong();
							fis.close();
							ois.close();
						} catch (FileNotFoundException e) {
							// TODO 自动生成的 catch 块
							e.printStackTrace();
						} catch (IOException e) {
							// TODO 自动生成的 catch 块
							e.printStackTrace();
						} catch (ClassNotFoundException e) {
							// TODO 自动生成的 catch 块
							e.printStackTrace();
						} 
					default:
						System.out.println("输入数字没有对应操作!");
						break;
					}
				}
				break;
			case 2:
				// 播放器管理
				while (true) {
					td.playerMenu();
					System.out.println("请选择数字进行播放器管理:");
					input2 = sc.nextInt();
					if (input2 == 9) {
						break;
					}
					switch (input2) {
					case 1:
						System.out.println("向播放器添加播放列表");
						System.out.println("输入要添加的播放列表名称:");
						String playerName=sc.next();
						//创建新的播放列表对象
						favoritePlayList=new PlayList(playerName);
						//将播放列表添加到播放器Map
						plc.addPlayList(favoritePlayList);
						break;
					case 2:
						System.out.println("从播放器删除播放列表");
						System.out.println("请输入要删除的播放列表名称");
						String playListName=sc.next();
						if(playListName.equals("主播放列表")) {
							System.out.println("主播放列表不能删除");
							break;
						}
						PlayList playList=plc.searchPlayListByName(playListName);
						if(playList==null) {
							System.out.println("该播放列表不存在!");
						}else {
							plc.deletePlayList(playList);
						}
						break;
					case 3:
						System.out.println("通过名称查询播放列表信息");
						System.out.println("请输入要查询的播放列表名称");
						String playListName1=sc.next();
						PlayList playList1=plc.searchPlayListByName(playListName1);
						if(playList1==null) {
							System.out.println("该播放列表不存在");
							break;
						}else {
							System.out.println("该播放列表存在");
							playList1.displayAllSong();
						}
						break;
					case 4:
						System.out.println("显示所有播放列表名称");
						plc.displayPlayListName();
						break;
					default:
						System.out.println("输入数字没有对应操作!");
						break;
					}
				}
				break;
			default:
				System.out.println("输入数字没有对应操作!");
				break;
			}
		}
	}

	// 主方法
	public static void main(String[] args) {
		TestDemo td = new TestDemo();
		td.test();
	}

}

							fos=new FileOutputStream(playListName2+".txt");
							oos=new ObjectOutputStream(fos);
							oos.writeObject(playList2);
							oos.flush();
							fos.close();
							oos.close();
							//读取歌单信息
							fis=new FileInputStream(playListName2+".txt");
							ois=new ObjectInputStream(fis);
							PlayList playList3=(PlayList)ois.readObject();
							playList3.displayAllSong();
							fis.close();
							ois.close();

1、这里面存储歌单信息 文件里面会是一串乱码,有没有办法把displayAllSong的信息存进去?
2、Serializable接口 经测试 Song类和PlayList类都要实现,为什么?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小小 2021-09-06 14:01:55

同学你好

1、乱码是正常的。因对象序列化机制是把内存中的Java对象转换成平台无关的二进制流,从而把二进制流持久地保存在磁盘上,所以文件中出现乱码是正常且正确的。

    displayAllSong返回的是播放列表中的所有歌曲的集合吗?可以使用循环遍历集合的方式将歌曲信息存储,例如:

https://img1.sycdn.imooc.com//climg/6135b097094f8f5208170725.jpg

2、不是的,Song类实现Serializable接口即可。

需要将要被序列化的类实现Serializable接口,此题中PlayList类的对象不需要序列化,所以不需要实现Serializable接口。

祝学习愉快~

  • 提问者 做条咸鱼才最好 #1
    但是我代码中是序列化歌单列表,只有Song实现接口会报错,要playlist类同时实现接口才会不报错。
    2021-09-06 14:07:35
  • 同学你好,同学代码中保存的是播放列表即PlayList类的对象,而不是播放列表中的歌曲,所以会出现异常。建议同学按照题目要求将播放列表中的歌曲进行保存。

    思路:根据播放列表名称获取到播放列表后,再获取下播放列表中的歌曲集合,最后将歌曲集合中的歌曲对象序列化保存,代码可参考上面的截图。

    祝学习愉快~

    2021-09-06 14:14:54
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师