2010-03-12 41 views
0

我正在測試一個示例,我遇到了一些問題。出於某種原因,儘管事實上管道應該傳輸數據,但即使(我假設)由於管道尺寸較小而必須在較小的操作中執行數據,執行會在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; 
} 
} 

乾杯,
克里斯

回答