在从文件中读取对象的数组列表内容时有很多 [Ljava.lang.Object;@hashcode
Having a lot of [Ljava.lang.Object;@hashcode in reading arraylist content of object from file
我将包含两个 属性 例如 String
和 ArrayList<Vector>
的代码对象写入文本文件。当我从文件中读回它们时,arraylist 属性 包含很多 [Ljava.lang.Object;@hashcode。但是有些数组列表没有这些。
这些写入文件:
gid : g5, code : [[[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], [c, [6, 6, 6, 6, 5]]], [[6], [c, [6, 6]]]]
gid : g6, code : [[[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, 6, 5, 5]] ]]
从文件中读回:
gid : g5, code : [[[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;@17c760b], c, [[Ljava.lang.Object;@1e44538, [Ljava.lang.Object; @1e44538, 4]]], [[[Ljava.lang.Object;@17c760b], [[[[c, [6, 6, 6, 6, 6, 6, 6, 5]], [Ljava.lang.Object;@17c760b]]]], [[4], [[Ljava.lang.Object;@29d838, [[Ljava.lang.Object;@1e44538, [Ljava.lang.Object;@1e44538, [Ljava.lang.Object;@1e44538, [Ljava.lang.Object;@1e44538, 4]]], [[Ljava.lang.Object;@1e44538], [[Ljava.lang.Object;@29d838, [[Ljava.lang.Object;@1e44538, [Ljava.lang.Object;@1e44538]]]]
gid : g6, code : [[[10], [c, [13, 5]]], [[ 11], [n, [12, [Ljava.lang.Object;@29d838, 3, n]]], [[[Ljava.lang.Object;@29d838], [[Ljava.lang.Object;@1327c02, [n, n]]], [[n], [c, [2, 2, c, c]]], [[c], [[n, 4], [2, 2, 2, 2, 6] , [Ljava.lang.Object;@16b7f83, [Ljava.lang.Object;@16b7f83]]], [[2], [o, [[Ljava.lang.Object;@16b7f83, [Ljava.lang.Object; @16b7f83, [Ljava.lang.Object;@16b7f83, c, c]]]]
这是代码class。
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();
}
}
我注意到您的代码存在一个问题,即您正试图对 ArrayList
执行 System.out()
,这将导致显示奇怪的内容。
我创建了一个名为 printList()
的辅助方法,它接受 List
作为输入。它遍历此列表,并将每个列表元素(Vector<Object[]>
)转换为二维数组。然后它使用 Arrays.deepToString()
打印出这个二维数组。
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 上本地测试了这段代码,它似乎可以正常工作。
问题是您在使用 System.out.println()
时打印出对象的哈希码
要打印出其中的实际数据,您应该使用增强的 for 循环。
gid
打印出来很好,因为它是一个 String
,但是 code
,其中包含 Vectors
的 ArrayList
,无法打印出来通过做 System.out.println(code)
(当然,除非你想要哈希码)
如果您想打印出所有向量,请改为执行此操作。
for(Vector vector : code){
System.out.println(vector);
}
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()
来遍历 ArrayList
项目及其内部 Vectors
并在 Vector.
[= 的每个项目上调用 Arrays.toString()
25=]
我将包含两个 属性 例如 String
和 ArrayList<Vector>
的代码对象写入文本文件。当我从文件中读回它们时,arraylist 属性 包含很多 [Ljava.lang.Object;@hashcode。但是有些数组列表没有这些。
这些写入文件:
gid : g5, code : [[[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], [c, [6, 6, 6, 6, 5]]], [[6], [c, [6, 6]]]]
gid : g6, code : [[[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, 6, 5, 5]] ]]
从文件中读回:
gid : g5, code : [[[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;@17c760b], c, [[Ljava.lang.Object;@1e44538, [Ljava.lang.Object; @1e44538, 4]]], [[[Ljava.lang.Object;@17c760b], [[[[c, [6, 6, 6, 6, 6, 6, 6, 5]], [Ljava.lang.Object;@17c760b]]]], [[4], [[Ljava.lang.Object;@29d838, [[Ljava.lang.Object;@1e44538, [Ljava.lang.Object;@1e44538, [Ljava.lang.Object;@1e44538, [Ljava.lang.Object;@1e44538, 4]]], [[Ljava.lang.Object;@1e44538], [[Ljava.lang.Object;@29d838, [[Ljava.lang.Object;@1e44538, [Ljava.lang.Object;@1e44538]]]]
gid : g6, code : [[[10], [c, [13, 5]]], [[ 11], [n, [12, [Ljava.lang.Object;@29d838, 3, n]]], [[[Ljava.lang.Object;@29d838], [[Ljava.lang.Object;@1327c02, [n, n]]], [[n], [c, [2, 2, c, c]]], [[c], [[n, 4], [2, 2, 2, 2, 6] , [Ljava.lang.Object;@16b7f83, [Ljava.lang.Object;@16b7f83]]], [[2], [o, [[Ljava.lang.Object;@16b7f83, [Ljava.lang.Object; @16b7f83, [Ljava.lang.Object;@16b7f83, c, c]]]]
这是代码class。
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();
}
}
我注意到您的代码存在一个问题,即您正试图对 ArrayList
执行 System.out()
,这将导致显示奇怪的内容。
我创建了一个名为 printList()
的辅助方法,它接受 List
作为输入。它遍历此列表,并将每个列表元素(Vector<Object[]>
)转换为二维数组。然后它使用 Arrays.deepToString()
打印出这个二维数组。
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 上本地测试了这段代码,它似乎可以正常工作。
问题是您在使用 System.out.println()
要打印出其中的实际数据,您应该使用增强的 for 循环。
gid
打印出来很好,因为它是一个 String
,但是 code
,其中包含 Vectors
的 ArrayList
,无法打印出来通过做 System.out.println(code)
(当然,除非你想要哈希码)
如果您想打印出所有向量,请改为执行此操作。
for(Vector vector : code){
System.out.println(vector);
}
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()
来遍历 ArrayList
项目及其内部 Vectors
并在 Vector.
[= 的每个项目上调用 Arrays.toString()
25=]