代码之家  ›  专栏  ›  技术社区  ›  Chris Dennett

编写小管道大小的对象时的管道传输块

  •  0
  • Chris Dennett  · 技术社区  · 15 年前

    我对一个我正在测试的例子有点问题。由于某种原因,在 oos.writeObject(new SimpleObject()); ,尽管事实上管道应该跨管道传输数据,即使(我假设)由于管道尺寸较小而不得不在较小的操作中传输数据。无论如何,当管道大小大于对象时,示例成功;当管道大小小于对象时,示例失败。如果有人能透露一些情况的话,我将不胜感激。

    import java.io.IOException;
    import java.io.PipedInputStream;
    import java.io.PipedOutputStream;
    import java.nio.ByteBuffer;
    
    import org.apache.mina.filter.codec.serialization.ObjectSerializationInputStream;
    import org.apache.mina.filter.codec.serialization.ObjectSerializationOutputStream;
    
    public class ObjTest4 {
     public static void main(String[] args) {
      System.out.println("exec1");
      int objectsToSend = 10;
      int objectsRecvd = 0;
    
      try {
       System.out.println("exec2");
    
       PipedOutputStream pos = new PipedOutputStream();
       ObjectSerializationOutputStream oos = new ObjectSerializationOutputStream(pos);
    
       PipedInputStream pis = new PipedInputStream(pos, 500);
       ObjectSerializationInputStream ois = new ObjectSerializationInputStream(pis);
    
       oos.setMaxObjectSize(2000);
       ois.setMaxObjectSize(2000);
    
       while (objectsRecvd < objectsToSend) {
        System.out.println("exec3");
    
        oos.writeObject(new SimpleObject());
    
        System.out.println("exec3.1");
    
        oos.flush();
    
        System.out.println("exec3.2");
    
        System.out.println("oisavail: " + ois.available());
    
        Object o = ois.readObject();
        if (o != null) {
         objectsRecvd++;
         System.out.println("o: " + o);
        } else {
         System.out.println("recvd null");
        }
       }
      } catch (IOException e) {
       e.printStackTrace();
      } catch (ClassNotFoundException e) {
       e.printStackTrace();
      }
     }
    }
    

    以及被序列化对象的类:

    package objtest;
    
    import java.io.Serializable;
    import java.util.EnumSet;
    
    public class SimpleObject implements Serializable {
     /**
      * 
      */
     private static final long serialVersionUID = 1L;
    
     public String moo = "moo";
     public EnumSet<EnumTest> set = EnumSet.of(EnumTest.Test);
     public String moo2 = "moo2";
     public String moo3 = "moo3";
     public String moo4 = "moo4_";
    
     {
      for (int i = 0; i < 8; i++) {
       moo4 += moo4;
      }
     }
    
     /**
      * 
      */
     public SimpleObject() {
     // TODO Auto-generated constructor stub
     }
    
     /**
      * @return the moo
      */
     public String getMoo() {
      return moo;
     }
    
     /**
      * @param moo the moo to set
      */
     public void setMoo(String moo) {
      this.moo = moo;
     }
    }
    

    干杯,
    克里斯

    1 回复  |  直到 14 年前
        1
  •  0
  •   Chris Dennett    15 年前

    对不起,我发现问题了——Java文档说 not to use piped streams from a single thread, as it may deadlock the thread :

    尝试使用来自 不建议使用单线程,因为 它可能会使线程死锁。