导出歌单不知道错在哪

导出歌单不知道错在哪

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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;
    }
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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);
        }
    }
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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();
        }
    }
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
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下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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