2014-03-28 29 views
1

這是我的第一個文件無法解析java.io.EOFException?

public class ObjectStream 
    { 
     public static void main(String args[]) throws FileNotFoundException, IOException 
    { 
    java.io.File f=new java.io.File("D:Employee.outt") ; 
     Employee e=new Employee("John"); 
     Employee e1=new Employee("Mary"); 
     Employee e2=new Employee("Christian"); 
     OutputStream os=new java.io.FileOutputStream(f); 

     java.io.ObjectOutputStream oos= new ObjectOutputStream(os); 
     oos.writeObject(e); 
     oos.writeObject(e1); 
     oos.writeObject(e2); 
     } 
     } 

這是我的第二個文件

public class Employee implements java.io.Serializable 
    { 
    private static int count=100; 
    private int eid; 
    private String ename; 

    public Employee() 
    { 
    count++; 
    this.eid=count;   
    } 

    public Employee(String ename) 
    { 
    this(); 
    this.ename=ename;   
    } 

    public static int getCount() { 
     return count; 
    } 

    public static void setCount(int count) { 
     Employee.count = count; 
    } 

    public int getEid() { 
     return eid; 
     } 

    public void setEid(int eid) { 
     this.eid = eid; 
    } 

    public String getEname() { 
     return ename; 
    } 

    public void setEname(String ename) { 
     this.ename = ename; 
    } 

    } 

這是我的第三個文件

 public class MainClass 
    { 
     public static void main(String args[]) throws FileNotFoundException,  IOException, ClassNotFoundException 
     { 
     File f=new File("D:Employee.outt"); 
     byte data[]=new byte[(int)f.length()]; 
    InputStream is=new java.io.FileInputStream(f); 
     java.io.ObjectInputStream ois=new java.io.ObjectInputStream(is); 
    Object o=ois.readObject(); 



    while(o!=null) 
     { 
    Employee e=(Employee)o; 
    System.out.println(e.getEid()); 
    System.out.println(e.getEname()); 
    o=ois.readObject(); 
     } 


    ois.close(); 
    is.close(); 
    } 
    } 

我試圖讀取存儲在Employee.outt中的對象通過這第三個文件,但它是讀所有的對象,但在結束扔

線程「main」中的異常java.io.EOFException。

我不知道如何解決它。

+0

您是否已經驗證文件路徑和名稱?它不應該是'D:\\ Employee.outt'嗎? –

+0

@Shishir是的我有它正在閱讀文件,在閱讀文件沒有問題,但在文件結束時給EOF異常。 – TruePS

+0

[EOFException在使用ObjectInputStream讀取文件時可能的重複](http://stackoverflow.com/questions/12684072/eofexception-when-reading-files-with-objectinputstream) –

回答

2
while(o!=null) 

這不是閱讀ObjectInputStream.,如果你寫了一個空的readObject()方法只返回一個空的有效方法。在流結束時,它會猜出,EOFException,,因此正確讀取流的方式是循環調用readObject(),直到捕獲到異常,然後中斷並關閉流。

的文件,它給EOF異常

這正是EOFException手段結束。

+0

但我的朋友通過做同樣的事情運行相同的程序。我只是不想捕捉異常我只是想知道什麼時候對象達到流的結束並關閉我的循環,就像在EOF達到它時返回-1和Filereader中一樣,並返回-1我們關閉我們的循環。 – TruePS

+1

你也可以首先發送多少個物體的長度,然後你可以停止閱讀。 – centic

+1

您沒有任何選擇。這就是API的工作原理。它拋出'EOFException:'你必須趕上它。您不能依賴@centic所建議的文件中的信息:文件過早結束仍然可能發生在現實世界中,並且您仍然必須正確處理它。 – EJP

1

您需要在ObjectStream類中關閉ObjectOutputStream

oos.writeObject(e); 
oos.writeObject(e1); 
oos.writeObject(e2); 

oos.close(); 

MainClass可以使用嘗試,終於塊關閉InputStream。

try 
{ 
    InputStream is=new java.io.FileInputStream(f); 
    java.io.ObjectInputStream ois=new java.io.ObjectInputStream(is);  

    // READ logic here 
} 
finally 
{  
ois.close(); 
is.close(); 
} 
+0

不,它給出流關閉錯誤,因爲我正在讀取3個對象循環中。 – TruePS

+1

@TruePS不,它不會,除非你把close放到讀循環中,這不是他在這裏所建議的。他說你應該在完成寫作之後關閉流,但這並不能解決你的實際問題。 – EJP

+0

@EJP我還沒有讀完流,所以如何在讀取整個流之前關閉流。如果我想讀取100個對象,那麼如果我關閉循環中的流。如何能夠讀取其他99個對象。 – TruePS

1
  1. 你真的應該刷新並關閉「第一個文件」中的對象輸出流。

  2. 您只需要在「第三個文件」中關閉'ois'。另一個流將自動關閉。

  3. 如果您知道要寫入多少個對象,請更改「第一個文件」以先寫下對象的數量,然後更改「第三個文件」以讀取該數字並僅讀取那麼多對象。這樣,你永遠不會得到EOF異常,因爲當你讀完最後一個對象時你會停止閱讀。

正如EJP指出的那樣,您仍然必須捕捉EOFException,因爲您正在閱讀的文件可能已損壞。

在第一個文件:

... 
oos.writeInt(3); 
oos.writeObject(e); 
... 

在第三檔:

... 
try { 
    int numObjects = ois.readInt(); 
    for(int a = 0; a < numObjects; ++a) { 
     ... 
    } 
} catch(EOFException e) { 
    ... 
} 
+1

除非出現寫錯文件的錯誤,否則您將永遠不會得到'EOFException'',這是您在現實世界中無法排除的,所以您*會*得到它,所以你必須防守代碼反對它。 – EJP

+1

非常正確,您仍然需要捕獲EOF異常,但現在它確實是一個異常情況,而不是濫用。 – EdwinW

+1

我對討論異常處理的意見不感興趣。我只想討論如何使用這個已經設計好的API。 – EJP