【问题标题】:Appendable Output Stream - Java附加输出流 - Java
【发布时间】:2018-09-14 06:37:55
【问题描述】:

我正在将对象附加到二进制文件中。我的教授提供了一个“可附加的”输出流类供我们在此作业中使用,据我了解,这应该可以防止标头损坏。但是,当我尝试打开二进制文件时,我仍然得到一个损坏的标题。该文件的名称是test.dat,据我所知,程序写入数据很好,但是一旦我尝试从中读取,一切都会消失。

fileName 是定义这些方法的同一类中的数据字段,定义如下File filename = new File("test.dat");

如果有人能指出我正确的方向,那就太好了!提前致谢

我的代码

 /**
 Writes a pet record to the file

 @param pets The pet record to write
 */
 public static void writePets(PetRecord pet){
   AppendObjectOutputStream handle = null;
   try{
     handle = new AppendObjectOutputStream(new FileOutputStream(fileName, true));
     handle.writeObject(pet);
     handle.flush();
   } catch (IOException e){
    System.out.println("Fatal Error!");
    System.exit(0);
   } finally {
   try{
    handle.close();
   } catch (IOException e){
     e.printStackTrace();
   }
 }
}

  /**
  Reads all pets from the file so long as the user continues to enter "next"
  */
  public static void readPets(){
    Scanner keys = new Scanner(System.in);
    String input = "";
    ObjectInputStream handle = null;
    PetRecord pet = null;
    try{
      handle = new ObjectInputStream(new FileInputStream(fileName)); // stack trace points here
      do{
        try{
          pet = (PetRecord) handle.readObject();
          System.out.println("\n" + pet);
          System.out.println("[*] type \"next\" to continue");
          input = keys.nextLine();
        } catch (IOException e){
          System.out.println("\t[*] No More Entries [*]");
          e.printStackTrace();
          break;
        }
      } while (input.matches("^n|^next"));
      handle.close();
    } catch (ClassNotFoundException e){
      System.out.println("The dat file is currupted!");
    } catch (IOException e){
      System.out.println("\t[*] No Entries! [*]");
      e.printStackTrace();
    }
  }

提供的类:

public class AppendObjectOutputStream extends ObjectOutputStream
{
   // constructor
   public AppendObjectOutputStream( OutputStream out ) throws IOException
   {
      // this constructor just calls the super (parent)
      super(out);
   }

   @Override
   protected void writeStreamHeader() throws IOException
   {
      // this forces Java to clear the previous header, re-write a new header,
      // and prevents file corruption
      reset();
   }
}

堆栈跟踪:

java.io.StreamCorruptedException: invalid stream header: 79737200
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:808)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:301)
    at UIHandle.readPets(UIHandle.java:381)
    at UIHandle.list(UIHandle.java:79)
    at UIHandle.command(UIHandle.java:103)
    at UIHandle.mainUI(UIHandle.java:40)
    at UIHandle.main(UIHandle.java:405)

【问题讨论】:

    标签: java object append binaryfiles


    【解决方案1】:

    事实证明,如果您在附加文件之前确保文件退出,这会有所帮助。 问题不在于读取文件,而是在文件不存在时尝试附加到文件。修复是一个简单的 if/else 来检查文件是否存在。如果不存在,则照常写入文件,如果存在,则使用自定义附加类。

      /**
      Writes a pet record to the file
      @param pet The pet record to write
      */
      public static void writePet(PetRecord pet){
        if (fileName.exists()){
          AppendObjectOutputStream handle = null;
          try{
            handle = new AppendObjectOutputStream(new FileOutputStream(fileName, true));
            handle.writeObject(pet);
            handle.flush();
          } catch (IOException e){
            System.out.println("Fatal Error!");
            System.exit(0);
          } finally {
            try{
              handle.close();
            } catch (IOException e){
              e.printStackTrace();
            }
          }
        } else {
          ObjectOutputStream handle = null;
          try{
            handle = new ObjectOutputStream(new FileOutputStream(fileName));
            handle.writeObject(pet);
            handle.flush();
          } catch (IOException e){
            System.out.println("Fatal Error!");
            System.exit(0);
          } finally {
            try{
              handle.close();
            } catch (IOException e){
              e.printStackTrace();
            }
          }
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 2017-06-09
      • 1970-01-01
      • 2012-07-19
      • 2012-11-17
      相关资源
      最近更新 更多