2012-04-13 23 views
1

ObjectInputStreamまたはObjectOutputStreamが空であるかどうかを確認する方法があるかどうかは疑問です。私のプログラムでは、意味します。最初にそれが実行されるときにObjectInputStreamreadObject()メソッドを使用しますが、それでもファイルが空の場合はEOF例外(ファイルの終わり)が返されるため、空であるかどうかを確認して例外を取り除きたいと思います。readObjectのEOF例外

私はそれを正しくやっていますか?シリアライズのために、クライアントとサーバーの両方で以下のような名前と属性のクラスを作成しました。

public class KeyAdr implements Serializable{ 

String adr; 
String key; 


} 
.... 

    static FileInputStream fIn=null; 
    static ObjectInputStream oIn=null; 
    private static KeyAdr test=new KeyAdr(); 

.... 

      fIn= new FileInputStream("d:\\someFile.ser"); 
      oIn = new ObjectInputStream(fIn); 
      test= (KeyAdr) oIn.readObject(); 

EDIT:

static File serAdrKey=new File("d:\\someFile.ser"); 
    static ObjectOutputStream oOut; 
    static FileOutputStream fOut; 
    static final Pattern WebUrlPattern = Pattern.compile (WebUrlRegex); 
    private static String WebUrlStr; 
    static KeyAdr letsDoIt= new KeyAdr(); 

.... 

public static void openStreams() throws IOException 
     { 
     fOut= new FileOutputStream(serAdrKey); 
    oOut = new ObjectOutputStream(fOut); 

     } 


     @Override 
public void beforeWindowOpen(NavigationEvent event) 
     { 

        temp=event.getURL().toString(); 


    Matcher WebUrlMatcher = WebUrlPattern.matcher (temp); 
    if (WebUrlMatcher.matches()) 
    { 
     int n = WebUrlMatcher.groupCount(); 
     for (int i = 0; i <= n; ++i) { 
    WebUrlStr = WebUrlMatcher.group (i); 

} 

        letsDoIt.adr=WebUrlStr;  

        try { 
        oOut.writeObject(letsDoIt); 

       } catch (IOException ex) { 
        Logger.getLogger(Cobratest2.class.getName()).log(Level.SEVERE, null, ex); 
       } 


        try { 
       oOut.flush(); 


        } catch (IOException ex) { 
       Logger.getLogger(Cobratest2.class.getName()).log(Level.SEVERE, null, ex); 
      } 

編集2

fIn= new FileInputStream("d:\\someFile.ser"); 
PushbackInputStream input = new PushbackInputStream(fIn); 
int c = input.read(); 
if(c != -1) 
{ 
    input.unread(c); 
    oIn = new ObjectInputStream(input); 
    test = (KeyAdr) oIn.readObject(); 
    // ...... 
} 

編集3:

EDIT2コードがスタックトレースと例外次のように私を与えた:

Exception in thread "main" java.io.EOFException 
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2552) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1297) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 
     at test.Test.processClient(Test.java:117) 
      at test.Test.run(Test.java:92) 
      at test.Test.main(Test.java:159) 
+0

ここで、ObjectOuputStreamを初期化しましたか? – Phani

+0

@Phani私はそれを質問に追加しました。私はここにそれを書くことを忘れました – lonesome

+0

私の第2編集の編集を見てください。 – EJP

答えて

0

最初にreadメソッドを使用して、少なくとも1バイトがあるかどうかを確認することができます。

read()戻すために-1ストリームの終わりに達したとき、非常に最初のread()返す場合-1ファイルが

補遺空でなければなりませんが保証されています。あなたがマークすることができるはずのFileInputStreamを使用して リード・バイトの損失を避けるために/ reset。

ただし、java.util.Fileを使用してファイルの空を事前にチェックしたい場合があります。

+0

これは**もっとも間違いなく**動作しません。シリアライゼーションに必要なデータを捨てます。 – EJP

1

私は例外をオフに取り除く空であるかどうかをチェックしたいと思います:

なぜ?これは、EOFExceptionがの場合です。

+0

私はコードを修正してから例外を修正することを意味しました – lonesome

+0

@lonesome例外を取り除くためにコードを修正することはできません。ファイルの終わりに達するといつも起こり、いつ起こるのかわからないことがあります。 – EJP

関連する問題