2012-04-13 14 views
1

Ich frage mich, ob es trotzdem zu prüfen ist, ob ObjectInputStream oder ObjectOutputStream leer ist oder nicht. Ich meine, in meinem Programm. beim ersten Mal, wenn es läuft, ObjectInputStream wird seine readObject() Methode dann verwenden, weil immer noch die Datei leer es gibt mir eine EOF Ausnahme (Ende der Datei), also würde ich gerne prüfen, ob es leer ist oder nicht dann loswerden die Ausnahme:EOF-Ausnahme für readObject

Und mache ich es richtig? Zum Serialisieren habe ich die Klasse mit dem gleichen Namen und Attribut wie unten in Client und Server erstellt.

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); 
      } 

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

bearbeiten 3:

die EDIT2 Codes mich mit dem Stacktrace folgende Ausnahme gab:

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

Wo haben Sie den ObjectOuputStream initialisiert? – Phani

+0

@Phani habe ich es zur Frage hinzugefügt. Ich habe vergessen, es hier zu schreiben – lonesome

+0

Siehe meine Bearbeitung Ihrer 2. Bearbeitung. – EJP

Antwort

0

Sie können zuerst die Methode read verwenden, um zu prüfen, ob mindestens 1 Byte vorhanden ist.

read() ist garantiert -1 zurück, wenn das Ende des Stroms, wenn die ersten read() Renditen erreicht ist -1 die Datei

Addendum muss leer sein: Mit dem Fileinputstream sollten Sie in der Lage sein zu markieren/reset, um den Verlust des Lese-Bytes zu vermeiden.

Sie können jedoch java.util.File verwenden, um die Leere der Datei vorher zu prüfen.

+0

Das wird ** definitiv ** nicht funktionieren. Es wird Daten wegwerfen, die die Serialisierung benötigt. – EJP

1

Ich mag wäre zu prüfen, ob sie leer ist oder nicht, dann bekommen die Ausnahme befreien off:

Warum? Das ist die EOFException für.

+0

ich meinte, meinen Code dann keine Ausnahme mehr hehe – lonesome

+0

@lonesome Sie können Ihren Code nicht beheben, um die Ausnahme zu beseitigen. Es wird immer passieren, wenn Sie das Ende der Datei erreichen, und Sie können nicht sicher sein, wann das passieren wird. – EJP

Verwandte Themen