LHA Library for Java

jp.gr.java_conf.dangan.util.lha
クラス LhaImmediateOutputStream

java.lang.Object
  拡張java.io.OutputStream
      拡張jp.gr.java_conf.dangan.util.lha.LhaImmediateOutputStream

public class LhaImmediateOutputStream
extends OutputStream

接続されたRandomAccessFileに 圧縮データを出力するためのユーティリティクラス。
java.util.zip.ZipOutputStream と似たインターフェイスを持つように作った。
圧縮失敗時( 圧縮後サイズが圧縮前サイズを上回った場合 )の処理を 手動で行わなければならない。 以下に そのようなコードを示す。

 LhaCompressFiles( String arcfile, File[] files ){
   LhaImmediateOutputStream lio = new LhaImmediateOutputStream( arcfile );
 
   for( int i = 0 ; i < files.length ; i++ ){
     RandomAccessFile raf = new RandomAccessFile( files[i] );
     LhaHeader header = new LhaHeader( files[i].getName() );
     header.setLastModified( new Date( files.lastModified() ) );
     header.setOriginalSize( files.length() );
     byte[] buffer  = new byte[8192];
     int    length;
 
     while( 0 <= ( length = raf.read( buffer ) ) ){
         lio.write( buffer, 0, length );
     }
 
     if( !lio.closeEntry() ){
       header.setCompressMethod( CompressMethod.LH0 );
       lio.putNextEntry( lhaheader );
       raf.seek( 0 );
       while( 0 <= ( length = raf.read( buffer ) ) ){
           lio.write( buffer, 0, length );
       }
       lio.closeEntry();
     }
 
   lio.close();
 }
 
進捗報告を実装する場合、このような処理をクラス内に隠蔽すると進捗報告は何秒間か 時によっては何十分も応答しなくなる。(例えばギガバイト級のデータを扱った場合) LhaRetainedOutputStream で発生する、このような事態を避けるために設計されている。
また、JDK 1.1 以前では RandomAccessFile が setLength を持たないため、 書庫データの後ろに他のデータがある場合でもファイルサイズを切り詰めることが出来ない。
この問題点は常にサイズ0の新しいファイルを開く事によって回避する事ができる。
 -- revision history --
 $Log: LhaImmediateOutputStream.java,v $
 Revision 1.2  2002/12/11 02:25:06  dangan
 [bug fix]
     jdk1.2 でコンパイルできなかった箇所を修正。

 Revision 1.1  2002/12/08 00:00:00  dangan
 [maintenance]
     LhaConstants から CompressMethod へのクラス名の変更に合わせて修正。

 Revision 1.0  2002/08/05 00:00:00  dangan
 add to version control
 [change]
     コンストラクタから 引数に String encode を取るものを廃止、
     Properties を引数に取るものを追加。
 [maintenance]
     ソース整備
     タブ廃止
     ライセンス文の修正

 

バージョン:
$Revision: 1.2 $
作成者:
$Author: dangan $

コンストラクタの概要
LhaImmediateOutputStream(File filename)
          filename のファイルに 圧縮データを出力するOutputStreamを構築する。
LhaImmediateOutputStream(File filename, Properties property)
          filename のファイルに 圧縮データを出力するOutputStreamを構築する。
LhaImmediateOutputStream(RandomAccessFile file)
          fileに 圧縮データを出力するOutputStreamを構築する。
LhaImmediateOutputStream(RandomAccessFile file, Properties property)
          fileに 圧縮データを出力するOutputStreamを構築する。
LhaImmediateOutputStream(String filename)
          filename のファイルに 圧縮データを出力するOutputStreamを構築する。
LhaImmediateOutputStream(String filename, Properties property)
          filename のファイルに 圧縮データを出力するOutputStreamを構築する。
 
メソッドの概要
 void close()
          出力先に全てのデータを出力し、ストリームを閉じる。
 boolean closeEntry()
          現在出力中のエントリを閉じ、次のエントリが出力可能な状態にする。
 void flush()
          現在書き込み中のエントリのデータを強制的に出力先に書き出す。
 void putNextEntry(LhaHeader header)
          新しいエントリを書き込むようにストリームを設定する。
 void putNextEntryAlreadyCompressed(LhaHeader header)
          既に圧縮済みのエントリを書きこむようにストリームを設定する。
 void putNextEntryNotYetCompressed(LhaHeader header)
          未だに圧縮されていないエントリを書きこむようにストリームを 設定する。
 void write(byte[] buffer)
          現在のエントリに bufferの内容を全て書き出す。
 void write(byte[] buffer, int index, int length)
          現在のエントリに bufferの indexから lengthバイトのデータを書き出す。
 void write(int data)
          現在のエントリに1バイトのデータを書きこむ。
 
クラス java.lang.Object から継承したメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

コンストラクタの詳細

LhaImmediateOutputStream

public LhaImmediateOutputStream(String filename)
                         throws FileNotFoundException
filename のファイルに 圧縮データを出力するOutputStreamを構築する。
各圧縮形式に対応した符号器の生成式等を持つプロパティには LhaProperty.getProperties() で得られたプロパティが使用される。

パラメータ:
filename - 圧縮データを書きこむファイルの名前
例外:
FileNotFoundException - filename で与えられたファイルが見つからない場合。
SecurityException - セキュリティマネージャがファイルへのアクセスを許さない場合。
関連項目:
LhaProperty.getProperties()

LhaImmediateOutputStream

public LhaImmediateOutputStream(String filename,
                                Properties property)
                         throws FileNotFoundException
filename のファイルに 圧縮データを出力するOutputStreamを構築する。

パラメータ:
filename - 圧縮データを書きこむファイルの名前
property - 各圧縮形式に対応した符号器の生成式等が含まれるプロパティ
例外:
FileNotFoundException - filename で与えられたファイルが見つからない場合。
SecurityException - セキュリティマネージャがファイルへのアクセスを許さない場合。
関連項目:
LhaProperty

LhaImmediateOutputStream

public LhaImmediateOutputStream(File filename)
                         throws IOException
filename のファイルに 圧縮データを出力するOutputStreamを構築する。
各圧縮形式に対応した符号器の生成式等を持つプロパティには LhaProperty.getProperties() で得られたプロパティが使用される。

パラメータ:
filename - 圧縮データを書きこむファイルの名前
例外:
FileNotFoundException - filename で与えられたファイルが見つからない場合。
SecurityException - セキュリティマネージャがファイルへのアクセスを許さない場合。
IOException - JDK1.2 でコンパイルするためだけに存在する。
関連項目:
LhaProperty.getProperties()

LhaImmediateOutputStream

public LhaImmediateOutputStream(File filename,
                                Properties property)
                         throws IOException
filename のファイルに 圧縮データを出力するOutputStreamを構築する。

パラメータ:
filename - 圧縮データを書きこむファイルの名前
property - 各圧縮形式に対応した符号器の生成式等が含まれるプロパティ
例外:
FileNotFoundException - filename で与えられたファイルが見つからない場合。
SecurityException - セキュリティマネージャがファイルへのアクセスを許さない場合。
IOException - JDK1.2 でコンパイルするためだけに存在する。
関連項目:
LhaProperty

LhaImmediateOutputStream

public LhaImmediateOutputStream(RandomAccessFile file)
fileに 圧縮データを出力するOutputStreamを構築する。
各圧縮形式に対応した符号器の生成式等を持つプロパティには LhaProperty.getProperties() で得られたプロパティが使用される。

パラメータ:
file - RandomAccessFile のインスタンス。
の条件を満たすもの。
関連項目:
LhaProperty.getProperties()

LhaImmediateOutputStream

public LhaImmediateOutputStream(RandomAccessFile file,
                                Properties property)
fileに 圧縮データを出力するOutputStreamを構築する。
各圧縮形式に対応した符号器の生成式等を持つプロパティには LhaProperty.getProperties() で得られたプロパティが使用される。

パラメータ:
file - RandomAccessFile のインスタンス。
の条件を満たすもの。
property - 各圧縮形式に対応した符号器の生成式等が含まれるプロパティ
関連項目:
LhaProperty
メソッドの詳細

write

public void write(int data)
           throws IOException
現在のエントリに1バイトのデータを書きこむ。

パラメータ:
data - 書きこむデータ
例外:
IOException - 入出力エラーが発生した場合。

write

public void write(byte[] buffer)
           throws IOException
現在のエントリに bufferの内容を全て書き出す。

パラメータ:
buffer - 書き出すデータの入ったバイト配列
例外:
IOException - 入出力エラーが発生した場合。

write

public void write(byte[] buffer,
                  int index,
                  int length)
           throws IOException
現在のエントリに bufferの indexから lengthバイトのデータを書き出す。

パラメータ:
buffer - 書き出すデータの入ったバイト配列
index - buffer内の書き出すべきデータの開始位置
length - データのバイト数
例外:
IOException - 入出力エラーが発生した場合。

flush

public void flush()
           throws IOException
現在書き込み中のエントリのデータを強制的に出力先に書き出す。 これは PostLzssEncoder, LzssOutputStream の規約どおり flush() しなかった場合とは別のデータを出力する。 (大抵の場合は 単に圧縮率が低下するだけである。)

例外:
IOException - 入出力エラーが発生した場合
関連項目:
PostLzssEncoder.flush(), LzssOutputStream.flush()

close

public void close()
           throws IOException
出力先に全てのデータを出力し、ストリームを閉じる。
また、使用していた全てのリソースを解放する。

例外:
IOException - 入出力エラーが発生した場合

putNextEntry

public void putNextEntry(LhaHeader header)
                  throws IOException
新しいエントリを書き込むようにストリームを設定する。
このメソッドは 既に圧縮済みのエントリの場合は putNextEntryAlreadyCompressed(), 未だに圧縮されていない場合は putNextEntryNotYetCompressed() を呼び出す。
圧縮されているかの判定は、 のどれか一つでも LhaHeader.UNKNOWN であれば未だに圧縮されていないとする。
header には正確な OriginalSize が指定されている必要がある。

パラメータ:
header - 書きこむエントリについての情報を持つ LhaHeaderのインスタンス。
例外:
IOException - 入出力エラーが発生した場合
IllegalArgumentException - header.getOriginalSize() が LhaHeader.UNKNOWN を返す場合

putNextEntryAlreadyCompressed

public void putNextEntryAlreadyCompressed(LhaHeader header)
                                   throws IOException
既に圧縮済みのエントリを書きこむようにストリームを設定する。
圧縮済みデータが正しい事は、呼び出し側が保証する事。

パラメータ:
header - 書きこむエントリについての情報を持つ LhaHeaderのインスタンス。
例外:
IOException - 入出力エラーが発生した場合
IllegalArgumentException -
  1. header.getOriginalSize() が LhaHeader.UNKNOWN を返す場合
  2. header.getComressedSize() が LhaHeader.UNKNOWN を返す場合
  3. header.getCRC() が LhaHeader.UNKNOWN を返す場合
の何れか。
IllegalStateException - 以前のエントリが未だに closeEntry() されていない場合

putNextEntryNotYetCompressed

public void putNextEntryNotYetCompressed(LhaHeader header)
                                  throws IOException
未だに圧縮されていないエントリを書きこむようにストリームを 設定する。header に CompressedSize,CRCが指定されていても無 視される。このメソッドに渡される header には LhaHeader.setOriginalSize() を用いて 正確なオリジナルサイズ が指定されている必要がある。

パラメータ:
header - 書きこむエントリについての情報を持つ LhaHeaderのインスタンス。
例外:
IOException - 入出力エラーが発生した場合
IllegalArgumentException - header.getOriginalSize() が LhaHeader.UNKNOWN を返した場合
IllegalStateException - 以前のエントリが未だに closeEntry() されていない場合

closeEntry

public boolean closeEntry()
                   throws IOException
現在出力中のエントリを閉じ、次のエントリが出力可能な状態にする。
putNextEntryNotYetCompressed() で開いたエントリを閉じる場合 このメソッドは圧縮に失敗した(圧縮後サイズが圧縮前サイズを上回った)場合、 エントリ全体を書き込み先 の RandomAccessFile から削除する。
この削除処理は単に ファイルポインタを エントリ開始位置まで巻き戻すだけなので RandomAccessFile に setLength() が無い jdk1.1 以前では エントリを無圧縮(もしくは他の圧縮法)で再出力しない場合、 書庫データの終端以降に圧縮に失敗した不完全なデータが残ったままになる。

戻り値:
エントリが出力された場合は true、 圧縮前よりも圧縮後の方がサイズが大きくなったため、 エントリが削除された場合は false。 また、現在処理中のエントリが無かった場合も true を返す。
例外:
IOException - 入出力エラーが発生した場合

LHA Library for Java

バグやドキュメントの誤りの報告は作者宛てにお願いします。
ドキュメント内に含まれる社名、製品名については一般に各社の商標または登録商標です。
Copyright © 2001-2002 Michel Ishizuka. All Rights Reserved.