LHA Library for Java

jp.gr.java_conf.dangan.io
Class BitInputStream

java.lang.Object
  extended by java.io.InputStream
      extended by jp.gr.java_conf.dangan.io.BitInputStream
All Implemented Interfaces:
java.io.Closeable

public class BitInputStream
extends java.io.InputStream

ビット入力のためのユーティリティクラス。

 -- revision history --
 $Log: BitInputStream.java,v $
 Revision 1.5  2002/12/07 00:00:00  dangan
 [maintenance]
     ソース整備

 Revision 1.4  2002/11/15 00:00:00  dangan
 [improvement]
     prefetchBits() が  32bit の読み込みを保証するように修正
 [change]
     メソッド名の変更
     prefetchBit     -> peekBit
     prefetchBoolean -> peekBoolean
     prefetchBits    -> peekBits

 Revision 1.3  2002/11/02 00:00:00  dangan
 [bug fix]
     available() availableBits() で
     ブロックせずに読み込める量よりも大きい値を返していた。

 Revision 1.2  2002/09/05 00:00:00  dangan
 [change]
     EndOfStream に達した後の read( new byte[0] ) や 
     read( byte[] buf, int off, 0 ) の戻り値を
     InputStream と同じく 0 になるようにした

 Revision 1.1  2002/09/04 00:00:00  dangan
 [bug fix]
     skip( len ) と skipBits( len ) で len が 0 未満のとき
     正しく処理できていなかった。

 Revision 1.0  2002/09/03 00:00:00  dangan
 add to version control
 [bug fix]
     mark() で 接続された in に渡す readLimit の計算が甘かったため、
     要求された readLimit に達する前にマーク位置が破棄される事があった。
     EndOfStream に達した後の skip() および skip( 0 ) が -1 を返していた。
 [maintenance]
     タブ廃止
     ライセンス文の修正


 

Version:
$Revision: 1.5 $
Author:
$Author: dangan $

Constructor Summary
BitInputStream(java.io.InputStream in)
          入力ストリーム in からのデータをビット単位で 読み込めるようなストリームを構築する。
BitInputStream(java.io.InputStream in, int CacheSize)
          入力ストリーム in からのデータをビット単位で 読み込めるようなストリームを構築する。
 
Method Summary
 int available()
          接続された入力ストリームからブロックしないで 読み込むことのできるバイト数を得る。
 int availableBits()
          接続された入力ストリームからブロックしないで 読み込むことのできるビット数を得る。
 void close()
          この入力ストリームを閉じ、 使用していたリソースを開放する。
 void mark(int readLimit)
          接続された入力ストリームの現在位置にマークを設定し、 reset() メソッドでマークした時点の 読み込み位置に 戻れるようにする。
 boolean markSupported()
          接続された入力ストリームが mark() と reset() を サポートするかを得る。
 int peekBit()
          読み込み位置を変えずに 1ビットのデータを先読みする。
 int peekBits(int count)
          読み込み位置を変えずに count ビットのデータを先読みする。
戻り値が int型であることからもわかるように 最大有効ビット数は 32ビットである。
EndOfStream 付近を除いて、先読み出来ることが保障されるのは 32ビットである。(ビットバッファの大きさが 32ビットであるため)
もし 32ビット以上の先読み機能が必須となる場合は その都度 mark()、readBits()、reset() を繰り返すか、 このクラスを使用することを諦めること。
 boolean peekBoolean()
          読み込み位置を変えずに 1ビットのデータを 真偽値として先読みする。
 int read()
          接続されたストリームから 8ビットのデータを読み込む。
 int read(byte[] buffer)
          接続された入力ストリームから バイト配列 buffer を 満たすようにデータを読み込む。
データは必ずしも buffer を満たすとは限らないことに注意。
 int read(byte[] buffer, int index, int length)
          接続された入力ストリームから バイト配列 buffer の index で指定された位置から length バイトのデータを 読み込む。
このメソッドは lengthバイト読み込むか、 EndOfStream に到達するまでブロックする。
データは必ずしも length バイト読み込まれるとは限ら ないことに注意。
 int readBit()
          接続された入力ストリームから 1ビットのデータを 読み込む。
 int readBits(int count)
          接続された入力ストリームから count ビットのデータを 読み込む。 戻り値が int値である事からも判るように 読み込むことのできる 最大有効ビット数は 32ビットで あるが、count は32以上の値を設定してもチェックを 受けないため それ以上の値を設定した場合は ビット データが読み捨てられる。
たとえば readBits( 33 ) としたときは まず1ビットの データを読み捨て、その後の 32ビットのデータを返す。
また count に 0以下の数字を設定して呼び出した場合、 データを読み込む動作を伴わないため 戻り値は 常に0、 EndOfStream に達していても EOFException を 投げない点に注意すること。
 boolean readBoolean()
          接続された入力ストリームから 1ビットのデータを 真偽値として読み込む。
 void reset()
          接続された入力ストリームの読み込み位置を最後に mark() メソッドが呼び出されたときの位置に設定する。
 long skip(long length)
          接続された入力ストリームのデータを length バイト 読み飛ばす。
このメソッドは lengthバイト読み飛ばすか、 EndOfStream に到達するまでブロックする。
データは必ずしも length バイト読み飛ばされるとは限ら ないことに注意。
 int skipBits(int count)
          接続されたストリームから count ビットのデータを 読み飛ばす。
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

BitInputStream

public BitInputStream(java.io.InputStream in)
入力ストリーム in からのデータをビット単位で 読み込めるようなストリームを構築する。

Parameters:
in - 入力ストリーム

BitInputStream

public BitInputStream(java.io.InputStream in,
                      int CacheSize)
入力ストリーム in からのデータをビット単位で 読み込めるようなストリームを構築する。

Parameters:
in - 入力ストリーム
CacheSize - バッファサイズ
Method Detail

read

public int read()
         throws java.io.IOException
接続されたストリームから 8ビットのデータを読み込む。

Specified by:
read in class java.io.InputStream
Returns:
読み出された 8ビットのデータ。
既に EndOfStream に達している場合は -1
Throws:
java.io.IOException - 接続された入力ストリームで 入出力エラーが発生した場合
BitDataBrokenException - EndOfStreamに達したため 要求されたビット数のデータの 読み込みに失敗した場合。

read

public int read(byte[] buffer)
         throws java.io.IOException
接続された入力ストリームから バイト配列 buffer を 満たすようにデータを読み込む。
データは必ずしも buffer を満たすとは限らないことに注意。

Overrides:
read in class java.io.InputStream
Parameters:
buffer - 読み込まれたデータを格納するためのバイト配列
Returns:
buffer に読み込んだデータ量をバイト数で返す。
既に EndOfStream に達していた場合は -1 を返す。
Throws:
java.io.IOException - 接続された入力ストリームで 入出力エラーが発生した場合
BitDataBrokenException - EndOfStreamに達したため 要求されたビット数のデータの 読み込みに失敗した場合。

read

public int read(byte[] buffer,
                int index,
                int length)
         throws java.io.IOException
接続された入力ストリームから バイト配列 buffer の index で指定された位置から length バイトのデータを 読み込む。
このメソッドは lengthバイト読み込むか、 EndOfStream に到達するまでブロックする。
データは必ずしも length バイト読み込まれるとは限ら ないことに注意。

Overrides:
read in class java.io.InputStream
Parameters:
buffer - 読み込まれたデータを格納するためのバイト配列
index - buffer内のデータ読み込み開始位置
length - bufferに読み込むデータ量
Returns:
buffer に読み込んだデータ量をバイト数で返す。
既に EndOfStream に達していた場合は -1 を返す。
Throws:
java.io.IOException - 接続された入力ストリームで 入出力エラーが発生した場合
BitDataBrokenException - EndOfStreamに達したため 要求されたビット数のデータの 読み込みに失敗した場合。

skip

public long skip(long length)
          throws java.io.IOException
接続された入力ストリームのデータを length バイト 読み飛ばす。
このメソッドは lengthバイト読み飛ばすか、 EndOfStream に到達するまでブロックする。
データは必ずしも length バイト読み飛ばされるとは限ら ないことに注意。

Overrides:
skip in class java.io.InputStream
Parameters:
length - 読み飛ばすバイト数。
Returns:
実際に読み飛ばされたバイト数。
Throws:
java.io.IOException - 接続された入力ストリームで 入出力エラーが発生した場合

mark

public void mark(int readLimit)
接続された入力ストリームの現在位置にマークを設定し、 reset() メソッドでマークした時点の 読み込み位置に 戻れるようにする。

Overrides:
mark in class java.io.InputStream
Parameters:
readLimit - マーク位置に戻れる限界のバイト数。 このバイト数を超えてデータを読み 込んだ場合 reset()できなくなる可 能性がある。

reset

public void reset()
           throws java.io.IOException
接続された入力ストリームの読み込み位置を最後に mark() メソッドが呼び出されたときの位置に設定する。

Overrides:
reset in class java.io.InputStream
Throws:
java.io.IOException -
(1) BitInputStream に mark がなされていない場合。
(2) 接続された入力ストリームが markSupported()で false を返す場合。
(3) 接続された入力ストリームで 入出力エラーが発生した場合。
の何れか。

markSupported

public boolean markSupported()
接続された入力ストリームが mark() と reset() を サポートするかを得る。

Overrides:
markSupported in class java.io.InputStream
Returns:
ストリームが mark() と reset() を サポートする場合は true。
サポートしない場合は false。

available

public int available()
              throws java.io.IOException
接続された入力ストリームからブロックしないで 読み込むことのできるバイト数を得る。

Overrides:
available in class java.io.InputStream
Returns:
ブロックしないで読み出せるバイト数。
Throws:
java.io.IOException - 接続された入力ストリームで 入出力エラーが発生した場合

close

public void close()
           throws java.io.IOException
この入力ストリームを閉じ、 使用していたリソースを開放する。

Specified by:
close in interface java.io.Closeable
Overrides:
close in class java.io.InputStream
Throws:
java.io.IOException - 接続された入力ストリームで 入出力エラーが発生した場合

readBit

public int readBit()
            throws java.io.IOException
接続された入力ストリームから 1ビットのデータを 読み込む。

Returns:
読み込まれた1ビットのデータ。
既にEndOfStreamに達している場合は -1。
Throws:
java.io.IOException - 接続された入力ストリームで 入出力エラーが発生した場合

readBoolean

public boolean readBoolean()
                    throws java.io.IOException
接続された入力ストリームから 1ビットのデータを 真偽値として読み込む。

Returns:
読み込まれた1ビットのデータが 1であれば true、0であれば false を返す。
Throws:
java.io.EOFException - 既にEndOfStreamに達していた場合
java.io.IOException - 接続された入力ストリームで 入出力エラーが発生した場合

readBits

public int readBits(int count)
             throws java.io.IOException
接続された入力ストリームから count ビットのデータを 読み込む。 戻り値が int値である事からも判るように 読み込むことのできる 最大有効ビット数は 32ビットで あるが、count は32以上の値を設定してもチェックを 受けないため それ以上の値を設定した場合は ビット データが読み捨てられる。
たとえば readBits( 33 ) としたときは まず1ビットの データを読み捨て、その後の 32ビットのデータを返す。
また count に 0以下の数字を設定して呼び出した場合、 データを読み込む動作を伴わないため 戻り値は 常に0、 EndOfStream に達していても EOFException を 投げない点に注意すること。

Parameters:
count - 読み込むデータのビット数
Returns:
読み込まれたビットデータ。
Throws:
java.io.IOException - 接続された入力ストリームで 入出力エラーが発生した場合
java.io.EOFException - 既にEndOfStreamに達していた場合
BitDataBrokenException - 読み込み途中で EndOfStreamに達したため 要求されたビット数のデータの読み込み に失敗した場合。

skipBits

public int skipBits(int count)
             throws java.io.IOException
接続されたストリームから count ビットのデータを 読み飛ばす。

Parameters:
count - 読み飛ばしてほしいビット数
Returns:
実際に読み飛びしたビット数
Throws:
java.io.IOException - 接続された入力ストリームで 入出力エラーが発生した場合

peekBit

public int peekBit()
            throws java.io.IOException
読み込み位置を変えずに 1ビットのデータを先読みする。

Returns:
読み込まれた1ビットのデータ。
既にEndOfStreamに達している場合は -1。
Throws:
java.io.IOException - 接続された入力ストリームで 入出力エラーが発生した場合

peekBoolean

public boolean peekBoolean()
                    throws java.io.IOException
読み込み位置を変えずに 1ビットのデータを 真偽値として先読みする。

Returns:
読み込まれた1ビットのデータが 1であれば true、0であれば false を返す。
Throws:
java.io.EOFException - 既にEndOfStreamに達していた場合
java.io.IOException - 接続された入力ストリームで 入出力エラーが発生した場合

peekBits

public int peekBits(int count)
             throws java.io.IOException
読み込み位置を変えずに count ビットのデータを先読みする。
戻り値が int型であることからもわかるように 最大有効ビット数は 32ビットである。
EndOfStream 付近を除いて、先読み出来ることが保障されるのは 32ビットである。(ビットバッファの大きさが 32ビットであるため)
もし 32ビット以上の先読み機能が必須となる場合は その都度 mark()、readBits()、reset() を繰り返すか、 このクラスを使用することを諦めること。

Parameters:
count - 読み込むビット数
Returns:
先読みした count ビットのビットデータ
Throws:
java.io.EOFException - 既にEndOfStreamに達していた場合
java.io.IOException - 接続された入力ストリームで 入出力エラーが発生した場合
NotEnoughBitsException - count が先読み可能な範囲外の場合

availableBits

public int availableBits()
                  throws java.io.IOException
接続された入力ストリームからブロックしないで 読み込むことのできるビット数を得る。

Returns:
ブロックしないで読み出せるビット数。
Throws:
java.io.IOException - 接続された入力ストリームで 入出力エラーが発生した場合

LHA Library for Java

When you found typographical errors or omissions, Please mail to cqw10305@nifty.com
The company name and product name which are used in this document, it is the trademark or registered trademark of each company generally.
Copyright © 2001-2002 Michel Ishizuka. All Rights Reserved.