Last.fm java.lang.ClassCastException - 从文件中读取User对象

时间:2013-12-03 17:50:40

标签: java serializable objectinputstream last.fm

如果有人能帮我解决这个问题,我真的很感激。我在运行这个类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没有实现它。

这里有什么我想念的吗?

感谢您的帮助!

2 个答案:

答案 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