如果有人能帮我解决这个问题,我真的很感激。我在运行这个类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获取数据的类,将User对象存储到arraylist,然后将这些对象写入文件(users.csv)。一切正常,我使用ObjectOutputStream
写入文件。
我已经阅读了有关需要Serializable
的类的内容,但我假设de.umass.lastfm.User
没有实现它。
这里有什么我想念的吗?
感谢您的帮助!
答案 0 :(得分:1)
in.readObject()
返回一个字符串,您正在转换为HashMap
。这就是你ClassCastException
的原因。您可能需要以String格式编写用户详细信息(用户的字段)(可能是逗号分隔值),然后您可以将它们作为String读取,用逗号分隔并逐行分配给用户对象。
答案 1 :(得分:0)
您收到异常,因为文件users.csv中的数据存储为字符串,而您尝试将其转换(强制转换)为HashSet。 通常,readObject()方法返回一个Object,该Object可以转换为序列化的相同数据类型。 请检查文件users.csv中添加了哪些对象。是ArrayList还是其他东西。
注意:如果用户对象不是Serializable,则无法存储在文件中,您将获得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