4

特定のハードウェアインターフェイスからいくつかのバイトを読み取り、呼び出されるたびに新しいバイト配列を返すJNI関数 "byte [] read()"があります。読み取られたデータは常にASCIIテキストデータであり、行の終了には「\n」が付いています。

関数から読み取ったこれらのMULTIPLEバイト配列をInputStreamに変換して、1行ずつ出力できるようにします。

何かのようなもの:

while(running) {
    byte[] in = read(); // Can very well return in complete line
    SomeInputStream.setMoreIncoming(in);
    if(SomeInputStream.hasLineData())
        System.out.println(SomeInputSream.readline());
}

それ、どうやったら出来るの?

4

1 に答える 1

2

クラスjava.io.Readerを基本クラスとして選択し、抽象メソッドint read( char[] cbuf, int off, int len)をオーバーライドして、独自の文字指向ストリームを構築できます。

サンプルコード:

import java.io.IOException;
import java.io.Reader;

public class CustomReader extends Reader { // FIXME: choose a better name

   native byte[] native_call(); // Your JNI code here

   @Override public int read( char[] cbuf, int off, int len ) throws IOException {
      if( this.buffer == null ) {
         return -1;
      }
      final int count = len - off;
      int remaining = count;
      do {
         while( remaining > 0 && this.index < this.buffer.length ) {
            cbuf[off++] = (char)this.buffer[this.index++];
            --remaining;
         }
         if( remaining > 0 ) {
            this.buffer = native_call(); // Your JNI code here
            this.index  = 0;
         }
      } while( this.buffer != null && remaining > 0 );
      return count - remaining;
   }

   @Override
   public void close() throws IOException {
      // FIXME: release hardware resources
   }

   private int     index  = 0;
   private byte[]  buffer = native_call();

}
于 2012-11-11T18:44:24.517 に答える