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

Fud*_*get 1 java generics treemap 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");
  } 
}
Run Code Online (Sandbox Code Playgroud)

请不要建议做while(true)我喜欢的事情,EOFException因为:

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

use*_*421 6

在得到EOFException之前,请不要建议做像while(true)这样的事情

这正是我的建议.当您在寻找答案时,根据这样的任意标准限制解决方案空间会适得其反.

因为:

这不是我相信的异常处理

当您正在调用的API抛出异常时,就像这样,您没有任何选择,只能捕获它.无论您如何看待'异常处理是什么',您都要接受API设计人员设计API考虑的内容.

在此之后我还有更多事情要做,所以我不能让程序终止'

所以不要终止它.捕捉EOFException,关闭输入,并打破循环.

我看到更多昂贵的编程时间浪费在"什么是异常处理"上,而不是我真正可以信任的.