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 - 从文件中读取用户对象的主要内容,如果未能解决你的问题,请参考以下文章

PHP last.fm API Url Builder

ActionScript 3 Python:Last.fm简单API示例

Spotify vs Last FM,显示最后播放的曲目

r 您可以从last.fm的相似艺术家

从带有last.fm乱码的mysql表中查找给定年份的前100名[重复]

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