代码之家  ›  专栏  ›  技术社区  ›  Yu Wai Hlaing

从文件中读取对象的arraylist内容时需要大量[Ljava.lang.Object;@hashcode

  •  0
  • Yu Wai Hlaing  · 技术社区  · 10 年前

    我编写的Code对象包含两个属性,例如 String ArrayList<Vector> 转换为文本文件。当我从文件arraylist中读取它们时,属性包含大量[Ljava.lang.Object;@hashcode。但有些arraylist没有这些。

    这些将写入文件:

    吉德牌手表 :g5, 密码 :[[[7],[p,[8,8,8,7,7,7],o,[2,2,1]]],[[1],[c,[6,6,5]]],[[9],[c,[5,5]]]],[[3],[n,[4,4],c,[6、6,5]],[[4],[[n,4]]],[[5],[5],[c、[6]、[6]、6]】

    吉德牌手表 :g6, 密码 :[[[10],[c,[13,5]]],[[11],[n,[12,12,3,3]]],[[12],[n,[3,3],[[3],[c、[13,13,5,5],[[5],[c(13,13,13),13,6,6,6],[[13],[c,[6,6,5,5]]]]

    从文件中读取的内容包括:

    吉德牌手表 :g5, 密码 用法:[[[7],[p,[8,2,2,1,1,1],o,[2,6,1]]],[[5],[c,[6,[Ljava.lang.Object;@1e44538,5]]],[[9],[c,[4,4]]],[[3],[n,[4],[Ljava.lang.Object java.lang.Object;@17c760b],[[[c,[6,6,6,7,6,5,]],[Ljava.lang.Oobject;@17c760b]]],[[4],[[Ljava.lang.Object;@29d838,[[Ljava.lang.Object,@1e44538,[Ljava.lang.Oobject;@1e4453,[Ljava.lang.Oobject;@1e444538,[Ljava.lang.Object;@1e44558,4]],[[Ljava.lang.Object

    吉德牌手表 :g6, 密码 用法:[[[10],[c,[13,5]]],[[11],[n,[12,[Ljava.lang.Object;@29d838,3,n]]],][[Ljava.lang.Object;@19d838],[[Ljava.lang.Oobject;@1327c02,[n、n]]]、[[n],[c,[2,2,c,c]]],[c],[[n,4],[2、2、2、6,[Ljava.lang.Object,@16b7f83,[L java.lang.Object;@16b7f83]]],[[2],[o,[[Ljava.lang.Object;@16b7f83,[Ljava.lang.Oobject;@16b7 f83,[Ljava.lang.OObject;@16b f83,[Ljava.lang-Object;@16b7f 83,c,c]]]

    这里是Code类。

    public class Codes implements Serializable{
    
    public String gid;
    public ArrayList<Vector> code;
    
    public Codes()
    {
        gid = "";
        code  = new ArrayList<Vector>();
    }
    
    Codes(String id,ArrayList c)
    {
        gid = id;
        code = c;
    }
    
    public ArrayList<Vector> getCode()
    {
        return code;
    }
    
    public String getId()
    {
        return gid;
    }
    
    @Override
    public String toString()
    {
        return gid + " " + code;
    }
    

    我将此对象写入文本文件,如下所示:

    File f = new File("./CodesObj.txt");
        if(!f.exists()) {
            f.createNewFile();
            FileOutputStream fos = new FileOutputStream(f);
            ObjectOutputStream os = new ObjectOutputStream(fos);
           try{
                System.out.println("gid : " + c.gid + ", code : " + c.code);
                os.writeObject(c);
             }catch (IOException e){
                e.printStackTrace();
             }
            os.flush();
            os.close();
          }
    

    这是我从文件中读取的方式

    try{
         ois = new ObjectInputStream(new FileInputStream("./CodesObj.txt"));
         Codes obj = null;
        while( (obj = (Codes) ois.readObject()) != null){   
            if(obj instanceof Codes){
                System.out.println("gid : " + obj.gid + ", code : " + obj.code);    
            }
        }       
    }catch (EOFException ex) {  
       } catch (ClassNotFoundException ex) {
           ex.printStackTrace();
       } catch (FileNotFoundException ex) {
           ex.printStackTrace();
       } catch (IOException ex) {
           ex.printStackTrace();
       } finally {
           //Close the ObjectInputStream
           try {
               if (ois != null) {
                   ois.close();
               }
           } catch (IOException ex) {
               ex.printStackTrace();
           }
       }
    
    3 回复  |  直到 10 年前
        1
  •  2
  •   user207421    10 年前
    public ArrayList<Vector> code;
    

    很明显这是真的

    public ArrayList<Vector<Object[]>> code;
    

    至少在某些情况下。您正在打印 ArrayList ,调用 AbstractCollection.toString() ,调用 Vector.toString() ,调用 item.toString() 每个项目。如果项目是 Object[] ,你会得到的是 Object[].toString() ,调用 Object.toString(), 生成一般形式的字符串

    [Ljava.lang.Object;@hashcode
    

    对此没有简单的解决方案。您必须提供覆盖作为 Code.toString() 它走在 阵列列表 物品及其内部 Vectors 并呼叫 Arrays.toString() Vector.

        2
  •  2
  •   Tim Biegeleisen    10 年前

    我注意到你的代码有一个问题,那就是你试图做一个 System.out() 在上 ArrayList 这将导致显示奇怪的东西。

    我创建了一个名为 printList() 它接受 List 作为输入。它遍历这个列表,并转换每个列表元素,这是一个 Vector<Object[]> ,转换为2D阵列。然后它使用 Arrays.deepToString() 以打印出该2D阵列。

    public class Codes implements Serializable {
        public String gid;
        public ArrayList<Vector> code;
    
        // constructor and getters/setters
    
        @Override
        public String toString()
        {
            return gid + " " + printList(code);
        }
    
        private void printList(List list) {
            String listString = "[";
    
            for (int i=0; i < list.size(); ++i) {
                Vector v = list.get(i);
                Object[][] array = (Object[][])v.toArray(new Object[v.size()][]);
    
                if (i > 0) {
                    listString += ", ";
                }
    
                listString += Arrays.deepToString(array);
            }
            listString += "]";
    
            return listString;
        }
    }
    

    我已经在IntelliJ上本地测试了这段代码,它似乎正在运行。

        3
  •  -1
  •   Henry98    10 年前

    问题是当您使用 System.out.println()

    要打印出其中的实际数据,应该使用增强的for循环。

    gid 打印出来很好,因为它是 String 但是 code ,其中包含 ArrayList 属于 Vectors ,无法通过以下操作打印出来 System.out.println(code) (当然,除非你想要哈希码)

    如果要打印出所有矢量,请改为执行此操作。

    for(Vector vector : code){
       System.out.println(vector);
    }