2014-01-11 63 views
0
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.OutputStream; 

public class Main 
{ 
    static ObjectOutputStream outputStream; 
    static ObjectInputStream inputStream; 

    public static void main(String[] args) throws Exception 
    { 
     File file = new File("Test.ser"); 
     outputStream = openWriteFile(file); 
     write(new Integer(5)); 
     write(new Integer(3)); 
     write(new Integer(1)); 

     FileInputStream fileInputStream = new FileInputStream(file); 
     inputStream = openReadFile(fileInputStream); 
     readFile(); 
    } 

    public static ObjectOutputStream openWriteFile(File file) 
    { 
     try 
     { 
      if (file.exists()) 
       return new AppendableObjectOutputStream(new FileOutputStream(file, true)); 

      return new ObjectOutputStream(new FileOutputStream(file)); 
     } 

     catch (IOException e) 
     { 
      return null; 
     } 
    } 

    public static void write(Integer i) 
    { 
     try 
     { 
      outputStream.write(i); 
     } 

     catch (IOException ioException) 
     { 
      System.err.println("error"); 
     } 
    } 

    public static ObjectInputStream openReadFile(FileInputStream fileInputStream) 
    { 
     try 
     { 
      if(fileInputStream.getChannel().position() != 0) 
       return new ObjectInputStream(fileInputStream); 
      return new AppendableObjectInputStream(fileInputStream); 
     } 

     catch (IOException ioException) 
     { 
      return null; 
     } 
    } 

    public static void readFile() 
    { 
     try 
     { 
      while (true) 
      { 
       System.out.println("here"); 
       Integer integer = (Integer) inputStream.readObject(); 
       System.out.println("after"); 
       System.out.println(integer); 
      } 
     } 

     catch (ClassNotFoundException classNotFoundException) 
     { 
      classNotFoundException.printStackTrace(); 
     } 

     catch (IOException e) 
     { 
      System.err.println("ioexecption"); 
      e.printStackTrace(); 
     } 
    } 


    private static class AppendableObjectOutputStream extends ObjectOutputStream 
    { 

     public AppendableObjectOutputStream(OutputStream out) throws IOException 
     { 
      super(out); 
     } 

     @Override 
     protected void writeStreamHeader() throws IOException 
     { 
      // do not write a header 
     } 
    } 

    private static class AppendableObjectInputStream extends ObjectInputStream 
    { 

     public AppendableObjectInputStream(InputStream in) throws IOException 
     { 
      super(in); 
     } 

     @Override 
     protected void readStreamHeader() throws IOException 
     { 
      // do not read a header 
     } 
    } 
} 

輸出:故障閱讀和追加到的ObjectInputStream/ObjectOutputStream的

here 
ioexecption 
java.io.StreamCorruptedException: invalid type code: AC 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 
    at Main.readFile(Main.java:79) 
    at Main.main(Main.java:25) 

我遇到了一些麻煩,從我寫信給.ser文件讀取回來。我已經運行該程序幾次,並使用getClass(),發現這兩個流都是Appendable版本的流。 「此處」消息打印到控制檯,但不是「之後」。 「Test.ser」出現在與classpath相同的目錄中,幷包含內容「¬í」。

+0

修改您的代碼,以便您可以查看堆棧跟蹤以及在println(「here」)之後在該行上引發的異常的詳細信息,然後將該(堆棧跟蹤)添加到您的問題中。 – chairbender

回答

0

在處理輸入和輸出時,應該尋找對稱性:如果在一側寫入一個字節,則會在另一側讀取一個字節。如果你在一邊寫一個對象,你就會在另一邊讀一個對象。

您的代碼寫入3個字節,並嘗試讀取對象。這是行不通的。

我也不明白你想用你的可追加流來實現什麼。

+0

我必須編寫對象並將新的對象添加到現有的文件中,然後再讀取它們,所以我試圖在較小的程序中對其進行測試。我認爲它會以相同的方式工作,如果我把'int's'Integer'? – stumped

+0

如果您使用readObject()來讀取某些內容,則必須使用writeObject()編寫它。閱讀javadoc的write():它不會執行與writeObject()相同的操作。 –

+0

謝謝!我將其更改爲readObject(),並使它從我稱爲AccountRecord的類中讀取和寫入對象,但我仍然收到相同的錯誤 – stumped