1

ObjectInputStreamorObjectOutputStreamが空かどうかを確認する方法があるかどうか疑問に思っています。つまり、私のプログラムで。最初に実行すると、ObjectInputStreamその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(); 

編集:

 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)
4

2 に答える 2

1

空かどうかを確認してから、例外を取り除きたいです。

なんで?それが EOFException の目的です。

于 2012-04-13T10:09:10.690 に答える
0

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

read()ストリームの終わりに達したときに -1 を返すことが保証されています。最初read()に -1 が返された場合、ファイルは空でなければなりません

補遺: FileInputStream を使用すると、読み取りバイトが失われないようにマーク/リセットできるはずです。

ただし、java.util.File を使用して、事前にファイルが空であることを確認することをお勧めします。

于 2012-04-13T07:14:34.897 に答える