このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
では、RFBInputStream クラスを作成する。
基本となる InputStream の実装とバッファ処理、
そして RFB の基本型を読み取るためのメソッドを持たせる。
========== RFBInputStream.java ==========
package jp.loafer.rfb.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.FilterInputStream;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
/**
* RFB の基本型を扱う入力ストリームクラス。
* @author kes
*/
public class RFBInputStream extends FilterInputStream {
/**
* {@link RFBInputStream} のインスタンスを作成。
* @param in
*/
public RFBInputStream(InputStream in) {
super(new DataInputStream(new BufferedInputStream(in)));
}
/**
* 8 ビット符号なし整数を読み込む。
* @return 8 ビット符号なし整数。
* @throws IOException 入力エラー。
*/
public int readU8() throws IOException {
return ((DataInputStream)in).readUnsignedByte();
}
/**
* 16 ビット符号なし整数を読み込む。
* @return 16 ビット符号なし整数。
* @throws IOException 入力エラー。
*/
public int readU16() throws IOException {
return ((DataInputStream)in).readUnsignedShort();
}
/**
* 32 ビット符号なし整数を読み込む。
* @return 32 ビット符号なし整数。
* @throws IOException 入力エラー。
*/
public long readU32() throws IOException {
long value = ((DataInputStream)in).readInt();
return value & 0x00000000ffffffff;
}
/**
* 8 ビット符号つき整数を読み込む。
* @return 8 ビット符号つき整数。
* @throws IOException 入力エラー。
*/
public int readS8() throws IOException {
return ((DataInputStream)in).readByte();
}
/**
* 16 ビット符号つき整数を読み込む。
* @return 16 ビット符号つき整数。
* @throws IOException 入力エラー。
*/
public int readS16() throws IOException {
return ((DataInputStream)in).readShort();
}
/**
* 32 ビット符号つき整数を読み込む。
* @return 32 ビット符号つき整数。
* @throws IOException 入力エラー。
*/
public int readS32() throws IOException {
return ((DataInputStream)in).readInt();
}
/**
* 可変長文字列を読み込む。
* @return 文字列。
* @throws IOException 入力エラー。
*/
public String readString() throws IOException {
int length = readS32(); // U32
byte[] buffer = new byte[length];
((DataInputStream)in).readFully(buffer);
return new String(buffer, "ISO-8859-1");
}
/**
* バイト配列を読み込む。
* @param buffer
* @throws IOException
* @see java.io.DataInput#readFully(byte[])
*/
public void readFully(byte[] buffer) throws IOException {
((DataInputStream)in).readFully(buffer);
}
}
========== end of RFBInputStream.java ==========
RFBInputStream は FilterInputStream なので、
Socket#getInputStream() を渡せば利用できることになる。
これで、基本データ型を読み出す準備ができた。
readFully は固定長のバイトを読み出すためのおまけだ。
後は、同じ感覚で書き出す方のクラスを作ればよい。