2006 年 12 月 17 日 23 時 40 分

RFBInputStream クラス


このアーカイブは同期化されません。 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 は固定長のバイトを読み出すためのおまけだ。
後は、同じ感覚で書き出す方のクラスを作ればよい。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.