Last.fm java.lang.ClassCastException - 从文件中读取用户对象
Posted
技术标签:
【中文标题】Last.fm java.lang.ClassCastException - 从文件中读取用户对象【英文标题】:Last.fm java.lang.ClassCastException - reading in User objects from file 【发布时间】:2013-12-19 22:11:20 【问题描述】:如果有人能帮助我解决这个问题,我将不胜感激。运行此类 UniqueUsersData.java 时出现错误
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.util.HashSet
at gettingData.UniqueUsersData.main(UniqueUsersData.java:30)
UniqueUsersData.java:
package gettingData;
import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.io.Serializable;
import de.umass.lastfm.User;
public class UniqueUsersData
public static void main(String[] args) throws IOException, ClassNotFoundException
HashSet<User> userData = null;
String fileName = "users.csv";
ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));
try
while(in != null ) // keep reading if there are more lines in the file
userData = (HashSet<User>) in.readObject();
catch(IOException e)
e.printStackTrace();
String file = "usersInfo.csv";
BufferedWriter out = new BufferedWriter(new FileWriter(file, true));
for(User u: userData)
System.out.println(u.getId() + "," + u.getName() + "\n");
out.close();
// end main method
// end class
我有另一个类,它使用 last.fm api 获取数据,将用户对象存储到 arraylist,然后将这些对象写入文件 (users.csv)。一切正常,我使用ObjectOutputStream
写入文件。
我已经阅读了有关需要为 Serializable
的类的内容,但我假设 de.umass.lastfm.User
没有实现它。
这里有什么我遗漏的吗?
感谢您的帮助!
【问题讨论】:
【参考方案1】:in.readObject()
返回一个字符串,并且您正在转换为HashMap
。这就是为什么你得到ClassCastException
。您可能需要以字符串格式(可能是逗号分隔值)写入用户详细信息(用户字段),然后您可以将它们作为字符串读取,用逗号分隔并逐行分配给用户对象。
【讨论】:
【参考方案2】:您遇到异常,因为文件 users.csv 中的数据存储为字符串,而您尝试将其转换(转换)为 HashSet 。 通常 readObject() 方法返回一个对象,该对象可以转换为已序列化的相同数据类型。 请检查将什么对象添加到文件 users.csv。是 ArrayList 还是别的什么。
注意:如果用户对象不是可序列化的,则不能将其存储在文件中,你会得到 java.io.NotSerializableException
下面的代码显示了用户读写的示例,并进行了一些修改
User.java
package de.umass.lastfm;
import java.io.Serializable;
public class User implements Serializable
private static final long serialVersionUID = 1L;
private String id;
private String name;
/**
* @return the id
*/
public String getId()
return id;
/**
* @param id the id to set
*/
public void setId(String id)
this.id = id;
/**
* @return the name
*/
public String getName()
return name;
/**
* @param name the name to set
*/
public void setName(String name)
this.name = name;
UniqueUsersData.java
package de.umass.lastfm;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
public class UniqueUsersData
public static void main(String[] args) throws IOException, ClassNotFoundException
//populating user object in arraylist STARTS
User user1 = new User();
user1.setId("1");
user1.setName("name1");
User user2 = new User();
user2.setId("2");
user2.setName("name2");
List<User> userList = new ArrayList<User>();
userList.add(user1);
userList.add(user2);
//populating user object in arraylist ENDS
// Add ArrayList<User> to file users.csv STARTS
try
FileOutputStream fout = new FileOutputStream("users.csv");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(userList);
oos.close();
System.out.println("file added users.csv");
catch(Exception ex)
ex.printStackTrace();
// Add ArrayList<User> to file users.csv ENDS
// Reading ArrayList<User> from file users.csv STARTS
ArrayList<User> userData = null;
String fileName = "users.csv";
ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));
try
userData = (ArrayList<User>) in.readObject();
catch(IOException e)
e.printStackTrace();
finally
in.close();
String file = "usersInfo.csv";
BufferedWriter out = new BufferedWriter(new FileWriter(file, true));
for(User u: userData)
System.out.println(u.getId() + "," + u.getName() + "\n");
out.close();
// end main method
// end class
【讨论】:
是的,我的 users.csv 文件必须包含字符串而不是对象。 User.java 是第三方类 - 有没有办法让它可序列化?理想情况下,我将能够存储用户对象并根据 users.csv 文件中的对象查找有关用户的更多信息。 抱歉延迟响应...序列化 User 类的一种方法是创建一个新类,它是 User 的扩展并在那里实现 Serializable。参考:***.com/questions/2114207/…以上是关于Last.fm java.lang.ClassCastException - 从文件中读取用户对象的主要内容,如果未能解决你的问题,请参考以下文章
ActionScript 3 Python:Last.fm简单API示例