2015-11-25 40 views
-1

我有问题。现在我序列化二进制文件中的许多对象名为student.bin反序列化java中的很多对象?

在二进制文件中添加对象数据后,现在我想要检索写入二进制文件中的所有数据。

但它只检索第一个对象数据。

问题是:如何获取文件的所有内容?

这里是我的代码:

import java.util.Scanner; 
import java.io.*; 
import java.io.Serializable; 

public class Binary implements Serializable{ 

public int id; 
public String name; 
public int grade; 

public static void main(String argv[]) throws IOException, ClassNotFoundException 
{ 
    Binary b = new Binary(); 
    Scanner sc = new Scanner(System.in); 
    System.out.printf("Enter student id: "); 
    b.id = sc.nextInt(); 
    System.out.printf("Enter student name: "); 
    b.name = sc.next(); 
    System.out.printf("Enter student grade: "); 
    b.grade = sc.nextInt(); 
    ObjectOutputStream bin = new ObjectOutputStream(new FileOutputStream("C:\\Users\\فاطمة\\Downloads\\student.bin",true)); 
    bin.writeObject(b); 
    bin.close(); 

    ObjectInputStream in = new ObjectInputStream(new FileInputStream("C:\\Users\\فاطمة\\Downloads\\student.bin")); 
    Binary b2 = (Binary)in.readObject(); 
    System.out.println("Student ID: " + b2.id); 
    System.out.println("Student Name: " + b2.name); 
    System.out.println("Student Grade: " + b2.grade); 
    in.close(); 

} 
} 

回答

0

使用while循环。流有一个hasNext方法,只要文件中有未读字节,就可以继续读对象。请注意,如果文件末尾有额外的字节,则会导致错误。

List<Binary> binaries = new ArrayList<Binary>(); 
while(in.hasNext()) { 
    binaries.add((Binary) in.readObject()); 
} 

我很抱歉,如果这是无效的,我现在无法进行测试。

编辑:有可能hasNext是扫描仪而不是流的方法,在这种情况下,您必须将流包装到扫描仪对象中:Scanner read = new Scanner(in)

+0

谢谢你的回答,但如何打印元素? –

+0

你没有回答完整的问题。我想分别打印所有的对象数据...例如,如果我有像这样的对象数据(1,“John”,50),所以它应该打印,如我在我的代码上面写的输出声明。每个对象数据都必须单独打印。 –

+0

输入流没有'hasNext()'方法,并且您不能在同一个底层流上同时使用'Scanner'和'ObjectInputStream'。你还没有尝试过。 – EJP