将ByteInputStream分配给InputStream,保持绑定到终端仿真器

时间:2012-12-17 10:02:23

标签: java android stream inputstream

我正在尝试使用android中的库连接到终端模拟器,这将连接到串行设备,并应显示发送/接收的数据。要附加到终端会话,我需要提供inputStreamsetTermIn(InputStream)outputStreamsetTermOut(OutputStream)

我在onCreate()初始化并附加了一些像这样的流,这些只是初始流,并没有附加到我想要发送/接收的数据上。

private OutputStream bos;
private InputStream bis;

...

byte[] a = new byte[4096];
bis = new ByteArrayInputStream(a);
bos = new ByteArrayOutputStream();
session.setTermIn(bis);
session.setTermOut(bos);
/* Attach the TermSession to the EmulatorView. */
mEmulatorView.attachSession(session);

我现在想在发送和接收数据时将数据流分配给数据。在sendData()方法中,每次按下回车都会调用,我有:

public void sendData(byte[] data)
{
        bos = new ByteArrayOutputStream(data.length);         
}

并在onReceiveData()方法中,每次通过串行接收数据时调用:

public void onDataReceived(int id, byte[] data)
{
        bis = new ByteArrayInputStream(data);           
}

但是ByteArrayInputStream只能获得给它的数据,所以在发送和接收数据时需要不断创建。{1}}。现在的问题是,我希望这些数据出现在终端上,但是当我为数据分配bis时,它不再像我调用mEmulatorView.attachSession(session);

那样附加

有没有办法更新bis指向的内容而不破坏bis对终端的绑定?

编辑: 此外,如果我再次尝试调用attach,我会收到错误,尽管理想情况下我不想再次调用它等。

 SerialTerminalActivity.this.runOnUiThread(new Runnable() {
            public void run() {

                mSession.setTermIn(bis);
                mSession.setTermOut(bos);
                mEmulatorView.attachSession(mSession);
            }
          });

虽然那可能是我的编码。 http://i.imgur.com/de8D5.png

1 个答案:

答案 0 :(得分:1)

包装ByteArrayInputStream,添加你需要的功能。

举个例子:

public class MyBAIsWrapper implements InputStream {

   private ByteArrayInputStream wrapped;

   public MyBAIsWrapper(byte[] data) {
       wrapped=new ByteArrayInputStream(data);
   }

   //added method to refresh with new data
   public void renew(byte[] newData) {
       wrapped=new ByteArrayInpurStream(newData);
   }

   //implement the InputStreamMethods calling the corresponding methos on wrapped
   public int read() throws IOException {
      return wrapped.read();
   }

   public int read(byte[] b) throws IOException {
       return wrapped.read(b);
   }

   //and so on

}

然后,更改初始化代码:

byte[] a = new byte[4096];
bis = new MyBAIsWrapper(a);
session.setTermIn(bis);
//here, you could do somethin similar for OoutpuStream if needed, or keep the same initialization...
bos = new ByteArrayOutputStream();
session.setTermOut(bos);
/* Attach the TermSession to the EmulatorView. */
mEmulatorView.attachSession(session);

并更改onDataReceived方法以更新输入流数据:

public void onDataReceived(int id, byte[] data)
{
    //cast added to keep original code structure 
    //I recomend define the bis attribute as the MyBAIsWrapper type in this case
    ((MyBAIsWrapper)bis).renew(data);
}