0

私はMyQクラスを持っています

class MyQ{
   Queue<Request> q = new PriorityQueue<Request>(7, new SortRequest());
   QueueStorage qStorage = new QueueStorage();

 public void addRequest(int siteId, int timeStamp){
    try{
            q = qStorage.readRequestQ();
            q.add(new Request(sId, tStamp));
            qStorage.writeRequestQ(q);
    }catch(Exception e){
      e.printStackTrace();
    }
     //similarly deleteRequest() and showRequest() method follows.
   }  

私のRequestクラスには、セッターとゲッターに加えてint id2つのフィールドが含まれています。int count

SortRequestクラスは次のようなものです。

 class SortRequest implements Comparator<Request>, Serializable{
   public int compare(Request r1, Request r2) {
           if(r1.getCount()!=r2.getCount())
                return new Integer(r1.getCount()).compareTo(r2.getCount());
           if(r1.getId()!=r2.getId())
                return new Integer(r1.getId()).compareTo(r2.getId());
           return 0; 
   }
 }

QStorage クラスは次のようなものです。

 class QStorage{
      Queue<Request> readReqQ = new PriorityQueue<Request>(7, new SortRequest());

   public Queue<Request> readRequestQ() {
    try{
      FileInputStream fin = new FileInputStream("/home/winn/requestQ.ser");
      ObjectInputStream ois = new ObjectInputStream(fin);
      readReqQ = (Queue)ois.readObject();
             }
            catch(Exception e){
      return null;
            }
          return readReqQ;
       }

       public void writeRequestQ(Queue<Request> rq){
        Queue<Request> requestQ = rq;
    try{
        FileOutputStream fos = new FileOutputStream("/home/winn/requestQ.ser"); 
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(requestQ);
        System.out.println("done");
        }catch(Exception e){
            e.printStackTrace();
        }
        }
 }

また、オブジェクトの入出力ストリームを使用して追加/ポーリング操作を行うたびに、このキューをファイルに保存しています。要素を追加している間、最初に保存されたエントリを読み取り、次に新しいエントリを追加して、再度保存します。

ID は一意である必要があり、2 つ以上の ID の数は同じでも異なっていてもかまいません。そのため、count パラメータで並べ替えを実行していますが、count が同じ場合は、低い ID が高い ID に先行するように並べ替え順序を取得する必要があります。

最初にこのプログラムを Linux システムで試してみましたが、正常に動作し、期待どおりに正しくソートされていました。しかし、どういうわけか、すべてのクラスファイルを削除し、保存用の新しいファイルも作成しました。これで、同じコード(再コンパイル後)が完全に奇妙な結果をもたらしました。count パラメータに基づいてソートすることすらありません。これはなぜですか?

次に、Windows 7 システムで同じコードを試してみましたが、再び正しい結果が得られ始めました。なぜそのような奇妙な行動をするのですか?助けてください。ありがとう。

4

1 に答える 1

0

ObjectOutputStream を閉じていません。あなたが漠然と説明している動作ではなく、 StreamCorruptedException または EOFException を取得していると思います。または、そのような例外を無視して、とにかくコードを続行していること。

于 2013-10-26T11:59:32.217 に答える