java - 在java中读取对象直到文件结束

标签 java serialization objectinputstream eofexception

我正在尝试编写一个程序,用户可以在其中:1) 将一个人添加到联系人(姓名、电话、电子邮件),2) 从联系人中删除一个人,3) 从联系人中读取所有内容。

我这样做的方式是要求用户做出选择并分别做任何事情。对于写入,我只是将一个对象写入文件。对于删除,我想我会要求用户输入“姓氏”,它将用作 KEY(因为我使用的是 TreeMap)并将删除键的值(对象)。

所以我在阅读这里时遇到了问题。我正在尝试像这样读取对象:

public void readContact()
{
  TreeMap<String, Contact> contactMap = new TreeMap<String, Contact>();
  try 
  {
    ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(
                                                   new FileInputStream(file)));

    while( in.available() > 0 ) //This line does NOT read  
    {
      Contact c = (Contact)in.readObject();
      contactMap.put(c.getLastName(), c);           
    }

    for(Map.Entry contact : contactMap.entrySet() ) 
    {
      Contact con = contactMap.get( contact.getKey() );
      System.out.println( con.getLastName() + ", " + con.getFirstName() + ": " + con.getPhoneNumber() + "\t" + con.getEmail());
    }
  }
  catch(Exception e)
  {
    System.out.println("Exception caught");
  } 
}

在我得到 EOFException 之前,请不要建议做类似 while(true) 的事情,因为:

  1. 我相信这不是异常处理的目的
  2. 在此之后我还有更多的事情要做,所以我不能让程序终止'

最佳答案

Please do not suggest doing something like while(true) until I get the EOFException

这正是我的建议。当您搜索答案时,根据这样的任意标准来限定解决方案空间会适得其反。

because:

that isn't what exception handling is for I believe

当您调用的 API 抛出异常时,就像这个异常一样,您别无选择,只能捕获它。无论您怎么想“异常处理的目的是什么”,您都受制于 API 设计者设计 API 时的想法。

I still have more things to do after this so I can't have the program terminating'

所以不要终止它。捕获 EOFException, 关闭输入,并跳出循环。

我见过浪费在“异常处理的用途”上的编程时间比我想象的还要多。

关于java - 在java中读取对象直到文件结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14095713/

相关文章:

java - 在 Jsoup 中再次将原始 html 字符串拆分为行

java - 使用 java 检测 Apache Flink CEP 模式

c++ - 将枚举类变量保存到 JSON

java - 关闭 ObjectInputStream 和 ObjectOutputStream 的正确方法

java - 使用分段上传图像时如何在客户端获取进程

java - 如何获取树形图中的所有值组合

serialization - 是否有可能拦截 matlab save() 字节流

C# 序列化泛型列表<customObject> 到文件

java - 对象输入流/对象输出流 : Errors reading/Writing an appending Objects

Java 使用 ObjectInputStream 读取不同的变量