导出歌单不知道错在哪

导出歌单不知道错在哪

public class Song {
	private String id, name, singer;

	public Song() {

	}

	public Song(String id, String name, String singer) {
		super();
		this.id = id;
		this.name = name;
		this.singer = singer;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSinger() {
		return singer;
	}

	public void setSinger(String singer) {
		this.singer = singer;
	}

	@Override
	public String toString() {
		return "歌曲 [id为:" + id + ", 名称为:" + name + ", 演唱者为:" + singer + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + ((singer == null) ? 0 : singer.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj.getClass() == Song.class) {
			Song song = (Song) obj;
			return (song.getId().equals(id) && song.getName().equals(name) && song.getSinger().equals(singer));

		}
		return false;
	}

}

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.ArrayList;
import java.util.List;

public class PlayList {
	private String playListName;
	private List<Song> musicList;

	public PlayList() {

	}

	/**
	 * 构造方法
	 * 
	 * @param playListName 播放列表的名字
	 */
	public PlayList(String playListName) {
		super();
		this.setPlayListName(playListName);
		musicList = new ArrayList<Song>();
	}

	public String getPlayListName() {
		return playListName;
	}

	public void setPlayListName(String playListName) {
		this.playListName = playListName;
	}

	public List<Song> getMusicList() {
		return musicList;
	}

	public void setMusicList(List<Song> musicList) {
		this.musicList = musicList;
	}

	/**
	 * 方法一:增
	 * 
	 * @param song 歌曲类对象
	 */
	public void addTo(Song song) {
		boolean flag = false;
		for (Song s : musicList) {
			if (s.equals(song)) {
				flag = true;
				break;
			}
		}
		if (flag) {
			System.out.println("歌曲已经存在,添加失败!");
		} else {
			musicList.add(song);
		}
	}

	/**
	 * 方法二:显
	 */
	public void display() {
		System.out.println("所有歌曲为:");
		for (Song s : musicList) {
			System.out.println(s);
		}
	}

	/**
	 * 方法三:查
	 * 
	 * @param name 歌曲的名字
	 * @return 查到的歌曲信息,Song类的
	 */
	public Song searchSongByName(String name) {
		Song song = null;
		for (Song s : musicList) {
			if (s.getName().equals(name)) {
				song = s;
				break;
			}
		}
		return song;
	}

	/**
	 * 方法三:查
	 * 
	 * @param id 歌曲的id
	 * @return 查到的歌曲信息,Song类的
	 */
	public Song searchSongById(String id) {
		Song song = null;
		for (Song s : musicList) {
			if (s.getId().equals(id)) {
				song = s;
				break;
			}
		}
		return song;
	}

	/**
	 * 改
	 * 
	 * @param id   要查的歌曲的id
	 * @param song 新的歌曲信息
	 */
	public void update(String id, Song song) {
		Song songUpdate = searchSongById(id);
		if (songUpdate == null) {
			System.out.println("没有找到:" + id + "对应的歌曲");
		} else {
			musicList.remove(songUpdate);
			musicList.add(song);
		}
	}

	/**
	 * 删
	 * 
	 * @param id 指定删除歌曲的id
	 */

	public void delete(String id) {
		Song songDelete = searchSongById(id);
		if (songDelete == null) {
			System.out.println("没有找到id为:" + id + "对应的歌曲信息!请先添加!");
		} else {
			musicList.remove(songDelete);
		}
	}

}

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.HashMap;
import java.util.Map;
import java.util.Set;

public class PlayListCollection {
	Map<String, PlayList> playListMap;

	public PlayListCollection() {
		playListMap = new HashMap<String, PlayList>();
	}

	public Map<String, PlayList> getPlayListMap() {
		return playListMap;
	}

	public void setPlayListMap(Map<String, PlayList> playListMap) {
		this.playListMap = playListMap;
	}

	/**
	 * 方法一:增
	 * 
	 * @param playList 要增加的PlayList对象
	 */
	public void addPlayList(PlayList playList) {
		playListMap.put(playList.getPlayListName(), playList);
	}

	/**
	 * 方式二: 删
	 * 
	 * @param playList
	 */
	public void deletePlayList(PlayList playList) {
		playListMap.remove(playList.getPlayListName());
		System.out.println("删除成功!");
	}

	/**
	 * 方式三:查
	 * 
	 * @param playListName
	 * @return 播放列表
	 */

	public PlayList searchPlayListByName(String playListName) {
		PlayList playList = null;
		Set<String> set = playListMap.keySet();
		for (String s : set) {
			if (s.equals(playListName)) {
				playList = playListMap.get(s);
				break;
			}
		}
		return playList;
	}

	/**
	 * 方式四:显
	 */
	public void displayAllList() {
		Set<String> set = playListMap.keySet();
		System.out.println("播放器中播放列表名称为:");
		for (String s : set) {
			System.out.println(s);
		}
	}

	/**
	 * 方式五:导出歌单信息
	 * 
	 * @param playListName 歌单的名称
	 * @throws IOException 输入输出异常
	 */
	public void outPut(String playListName) throws IOException {
		FileOutputStream fos = null;
		ObjectOutputStream oos = null;
		FileInputStream fis = null;
		ObjectInputStream ois = null;
		try {
			// 写入
			fos = new FileOutputStream("名称.txt");
			oos = new ObjectOutputStream(fos);
			// 读出
			fis = new FileInputStream("名称.txt");
			ois = new ObjectInputStream(fis);
			PlayList playListSearch = searchPlayListByName(playListName);
			if (playListSearch == null) {
				System.out.println("该歌单列表不存在,请先添加!");
			} else {
				oos.writeObject(playListSearch);
				oos.flush();
				Object obj = null;
				try {
					while ((obj = ois.readObject()) != null) {
						System.out.println(obj);
						System.out.println();
					}
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
			}

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			fos.close();
			oos.close();
			fis.close();
			ois.close();
		}
	}

}

import java.io.IOException;
import java.util.Scanner;

public class TestDemo {

	// 主菜单页面
	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--通过歌曲名称查询播放列表中的歌曲 ");
		System.out.println("             4--通过歌曲id查询并修改播放列表中的歌曲 ");
		System.out.println("             5--通过歌曲id查询并删除所有播放列表中的当前歌曲 ");
		System.out.println("             6--显示播放列表中的所有歌曲 ");
		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("             8--导出歌单  ");
		System.out.println("             9--返回上一级菜单 ");
		System.out.println("***********************************************");
	}

	public void test() {
		TestDemo td = new TestDemo();
		Scanner sc = new Scanner(System.in);
		int input1, input2, input3;
		// 创建一个播放器
		PlayListCollection plc = new PlayListCollection();
		// 创建一个主播放列表
		PlayList mainPL = new PlayList("主播放列表");
		// 将主播放列表放入播放器
		plc.addPlayList(mainPL);
		PlayList diyList = null;

		while (true) {
			td.mainMenu();
			System.out.println("请输入对应的数字对播放列表进行管理:");
			input1 = sc.nextInt();
			if (input1 == 0) {
				System.out.println("退出程序!");
				break;
			}
			switch (input1) {
			// 播放列表管理
			case 1:
				while (true) {
					td.playListMenu();
					System.out.println("请输入数字对播放列表进行管理:");
					input2 = sc.nextInt();
					if (input2 == 9) {
						break;
					}
					switch (input2) {
					case 1:
						System.out.println("请输入要添加的歌曲数量");
						int count = sc.nextInt();
						for (int i = 1; i <= count; i++) {
							// 从键盘给歌曲赋值
							System.out.println("请输入第:" + i + "首歌");
							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);
							mainPL.addTo(song);
							mainPL.display();
						}
						break;
					case 2:
						System.out.println("请输入要添加的播放列表名称");
						String strPlayList = sc.next();
						// 判断播放列表是否已经存在
						diyList = plc.searchPlayListByName(strPlayList);
						if (diyList == null) {
							System.out.println("该播放列表不存在,请先添加!");
							break;
						} else {
							System.out.println("请输入要添加的歌曲数量:");
							int count1 = sc.nextInt();
							for (int i = 1; i <= count1; i++) {
								System.out.println("请输入要添加的第:" + i + "首歌的信息:");
								System.out.println("请输入要添加的歌曲id:");
								String strId = sc.next();
								Song songSearch = mainPL.searchSongById(strId);
								if (songSearch == null) {
									// 如果不存在则双添加
									System.out.println("该歌曲在主播放列表不存在,继续输入歌曲的其他信息!");
									System.out.println("请输入要添加的歌曲名称:");
									String strName = sc.next();
									System.out.println("请输入要添加的演唱者信息:");
									String strSinger = sc.next();
									songSearch = new Song(strId, strName, strSinger);
									diyList.addTo(songSearch);
									mainPL.addTo(songSearch);
								} else {
									// 如果存在则添加到自定义
									diyList.addTo(songSearch);
									System.out.println("添加成功!");
								}
								System.out.println("主播放列表:");
								mainPL.display();
								System.out.println("自定义播放列表:");
								diyList.display();
							}
						}
						break;
					case 3:
						System.out.println("请输入要查询的播放列表名称:");
						String strPlayListName = sc.next();
						diyList = plc.searchPlayListByName(strPlayListName);
						if (diyList == null) {
							// 没有的话跳出
							System.out.println("该播放列表不存在,请先创建!");
							break;
						} else {
							// 有的话输出查询结果
							System.out.println("请输入要查询的歌的名称:");
							String strName = sc.next();
							Song songSearch = diyList.searchSongByName(strName);
							if (songSearch == null) {
								System.out.println("该歌曲在播放列表:" + strPlayListName + "中不存在");
							} else {
								System.out.println("歌曲信息为:");
								System.out.println(songSearch);
							}
						}
						break;
					case 4:
						System.out.println("请输入要查询歌曲所在的播放列表:");
						String strPlayListName1 = sc.next();
						diyList = plc.searchPlayListByName(strPlayListName1);
						if (diyList == null) {
							System.out.println("该播放列表不存在,请先创建!");
							break;
						} else {
							System.out.println("请输入要查询歌曲的id:");
							String strId = sc.next();
							Song songSearch = diyList.searchSongById(strId);
							if (songSearch == null) {
								System.out.println("该歌曲在播放列表:" + strPlayListName1 + "中不存在");
							} else {
								System.out.println("请修改:");
								System.out.println("请输入要修改的歌曲新id:");
								String strIdNew = sc.next();
								System.out.println("请输入要修该的歌曲新名称:");
								String strNameNew = sc.next();
								System.out.println("请输入要修改的歌曲新演唱者:");
								String strSingerNew = sc.next();
								Song songNew = new Song(strIdNew, strNameNew, strSingerNew);
								diyList.update(strId, songNew);
								mainPL.update(strId, songNew);
								System.out.println("修改成功!");
								System.out.println("主播放列表:");
								mainPL.display();
								System.out.println("自定义播放列表:");
								diyList.display();
							}
						}

						break;
					case 5:
						System.out.println("请输入要查询歌曲所在的播放列表:");
						String strPlayListName2 = sc.next();
						diyList = plc.searchPlayListByName(strPlayListName2);
						if (diyList == null) {
							System.out.println("该播放列表不存在,请先创建!");
							break;
						} else {
							System.out.println("请输入要查询歌曲的id:");
							String strId = sc.next();
							Song songSearch = diyList.searchSongById(strId);
							if (songSearch == null) {
								System.out.println("该歌曲在播放列表:" + strPlayListName2 + "中不存在");
							} else {
								diyList.delete(strId);
								mainPL.delete(strId);
								System.out.println("删除成功!");
								System.out.println("主播放列表:");
								mainPL.display();
								System.out.println("自定义播放列表:");
								diyList.display();
							}
						}
						break;
					case 6:
						System.out.println("主播放列表:");
						mainPL.display();
						System.out.println("自定义播放列表:");
						diyList.display();
						break;
					default:
						System.out.println("该数字没有对应的操作!");
						break;
					}
				}
				break;
			// 播放器管理
			case 2:
				while (true) {
					td.playerMenu();
					System.out.println("请输入对应的数字对播放器进行管理");
					input3 = sc.nextInt();
					if (input3 == 9) {
						break;
					}
					switch (input3) {
					case 1:
						System.out.println("请输入要添加的播放列表名称:");
						String strPlayListName = sc.next();
						// 创建自定义对象
						diyList = new PlayList(strPlayListName);
						// 添加到HashMap中
						plc.addPlayList(diyList);
						System.out.println("添加成功!");
						break;
					case 2:
						System.out.println("请输入要删除的播放列表名称:");
						String strPlayListName1 = sc.next();
						if (strPlayListName1.equals("主播放列表")) {
							System.out.println("主播放列表不能删除!");
							break;
						} else {
							PlayList plSearch = plc.searchPlayListByName(strPlayListName1);
							if (plSearch == null) {
								System.out.println("该播放列表不存在,请先创建");
							} else {
								plc.deletePlayList(plSearch);
								plc.displayAllList();
							}
						}
						break;
					case 3:
						System.out.println("请输入要查询的播放列表名称:");
						String strPlayListName2 = sc.next();
						PlayList plSearch = plc.searchPlayListByName(strPlayListName2);
						if (plSearch == null) {
							System.out.println("该播放列表不存在,请先创建");
						} else {
							System.out.println("该播放列表存在!");
							System.out.println("该播放列表名称为:" + strPlayListName2);
							plSearch.display();
						}
						break;
					case 4:
						System.out.println("所有播放列表的名称为:");
						plc.displayAllList();
						break;
					case 8:
						// 导出歌单
						System.out.println("请输入要导出歌单的名称:");
						String strPlayListName3 = sc.next();
						PlayList plSearch1 = plc.searchPlayListByName(strPlayListName3);
						if (plSearch1 == null) {
							System.out.println("该播放列表不存在,请先创建");
						} else {
							System.out.println("该播放列表存在!");
							try {
								plc.outPut(strPlayListName3);
							} catch (IOException e) {
								e.printStackTrace();
							}
						}
						break;
					default:
						System.out.println("该数字没有对应的操作!");
						break;
					}
				}
				break;
			default:
				System.out.println("没有对应数字操作!");
				break;
			}
		}

	}

	public static void main(String[] args) {
		TestDemo td = new TestDemo();
		td.test();

	}

}

http://img1.sycdn.imooc.com//climg/5f3f3784094713af10190461.jpg不知道导出歌单错在哪里

正在回答

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

3回答

同学你好,是报java.io.EOFException异常吗?这个异常是意外读到了末尾造成的报错,同学在使用oos.writeObject()写入时,可以加上oos.writeObject(null);表示到了文件末尾,如:

http://img1.sycdn.imooc.com//climg/5f3f8e2009330ae705000168.jpg

这样读取时,读取到null就表示到了文件末尾,不再循环读取,就不再报错。

同学可以给PlayList类加上toString()方法,导出成功并再次读取,结果如下:

http://img1.sycdn.imooc.com//climg/5f3f8ef6099e65d809150155.jpg

祝:学习愉快~

好帮手慕阿满 2020-08-21 14:43:22

同学你好,txt文件中乱码是正常,通常我们只要保证通过程序读取到的数据是正常的即可。控制台报错不正常,从同学贴出来的报错信息上看,是PlayList类没有实现序列化造成。

序列化是一种用来处理对象流的机制 ,所谓对象流就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。如果同学要将PlayList和Song类对象写入txt文件中,那这两个类都需要实现序列化。

祝:学习愉快~

  • 提问者 孫瑪戈 #1
    谢谢老师,我两个都实现序列化了但还是会在控制台报错,其它功能都正常
    2020-08-21 14:45:36
  • 提问者 孫瑪戈 #2
    请问老师我两个都实现序列化了但还是会在控制台报错,其它功能都正常,这是怎么回事啊,需要怎么修改代码呢
    2020-08-21 16:11:56
提问者 孫瑪戈 2020-08-21 11:30:16

刚刚发现没实现Serializable接口和没刷新导致的没显示,但导出成功后txt文件里都是乱码且控制台报错是正常现象吗?

代码哪里还需要修改请老师指正

  • 提问者 孫瑪戈 #1
    请问Song类和PlayList类都需要实现Serializable接口吗
    2020-08-21 11:32:44
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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