簡體   English   中英

附加輸出流-Java

[英]Appendable Output Stream - Java

我正在將對象附加到二進制文件。 我的教授為我們提供了一個“可附加的”輸出流類供我們在此作業上使用,據我的理解,這是應該防止標題損壞的原因。 但是,當我嘗試打開二進制文件時,我仍然收到損壞的標頭。 該文件的名稱為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)

事實證明,如果在添加文件之前確保文件已退出,這將很有幫助。 問題不在於讀取文件,而是試圖在文件不存在時追加到文件中。 該修補程序很簡單,如果/其他則可以檢查文件是否存在。 如果不存在,則照常編寫文件;如果確實存在,則使用自定義附加類。

  /**
  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();
        }
      }
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM