jp.gr.java_conf.dangan.util.lha
Class LhaImmediateOutputStream
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]
ソース整備
タブ廃止
ライセンス文の修正
LhaImmediateOutputStream(File filename) - filename のファイルに 圧縮データを出力するOutputStreamを構築する。
各圧縮形式に対応した符号器の生成式等を持つプロパティには
LhaProperty.getProperties() で得られたプロパティが使用される。
|
LhaImmediateOutputStream(File filename, Properties property) - filename のファイルに 圧縮データを出力するOutputStreamを構築する。
|
LhaImmediateOutputStream(RandomAccessFile file) - fileに 圧縮データを出力するOutputStreamを構築する。
各圧縮形式に対応した符号器の生成式等を持つプロパティには
LhaProperty.getProperties() で得られたプロパティが使用される。
|
LhaImmediateOutputStream(RandomAccessFile file, Properties property) - fileに 圧縮データを出力するOutputStreamを構築する。
各圧縮形式に対応した符号器の生成式等を持つプロパティには
LhaProperty.getProperties() で得られたプロパティが使用される。
|
LhaImmediateOutputStream(String filename) - filename のファイルに 圧縮データを出力するOutputStreamを構築する。
各圧縮形式に対応した符号器の生成式等を持つプロパティには
LhaProperty.getProperties() で得られたプロパティが使用される。
|
LhaImmediateOutputStream(String filename, Properties property) - filename のファイルに 圧縮データを出力するOutputStreamを構築する。
|
void | close() - 出力先に全てのデータを出力し、ストリームを閉じる。
また、使用していた全てのリソースを解放する。
|
boolean | closeEntry() - 現在出力中のエントリを閉じ、次のエントリが出力可能な状態にする。
putNextEntryNotYetCompressed() で開いたエントリを閉じる場合
このメソッドは圧縮に失敗した(圧縮後サイズが圧縮前サイズを上回った)場合、
エントリ全体を書き込み先 の RandomAccessFile から削除する。
この削除処理は単に ファイルポインタを エントリ開始位置まで巻き戻すだけなので
RandomAccessFile に setLength() が無い jdk1.1 以前では
エントリを無圧縮(もしくは他の圧縮法)で再出力しない場合、
書庫データの終端以降に圧縮に失敗した不完全なデータが残ったままになる。
|
void | flush() - 現在書き込み中のエントリのデータを強§的に出力先に書き出す。
これは PostLzssEncoder, LzssOutputStream の規約どおり
flush() しなかった場合とは別のデータを出力する。
(大抵の場合は 単に圧縮率が低下するだけである。)
|
void | putNextEntry(LhaHeader header) - 新しいエントリを書き込むようにストリームを設定する。
このメソッドは 既に圧縮済みのエントリの場合は
putNextEntryAlreadyCompressed(),
未だに圧縮されていない場合は
putNextEntryNotYetCompressed() を呼び出す。
圧縮されているかの判定は、
- header.getCompressedSize()
- header.getCRC()
のどれか一つでも LhaHeader.UNKNOWN であれば未だに圧縮されていないとする。
header には正確な OriginalSize が指定されている必要がある。
|
void | putNextEntryAlreadyCompressed(LhaHeader header) - 既に圧縮済みのエントリを書きこむようにストリームを設定する。
圧縮済みデータが正しい事は、呼び出し側が保証する事。
|
void | putNextEntryNotYetCompressed(LhaHeader header) - 未だに圧縮されていないエントリを書きこむようにストリームを
設定する。header に CompressedSize,CRCが指定されていても無
視される。このメソッドに渡される header には
LhaHeader.setOriginalSize() を用いて 正確なオリジナルサイズ
が指定されている必要がある。
|
void | write(byte[] buffer) - 現在のエントリに bufferの内容を全て書き出す。
|
void | write(byte[] buffer, int index, int length) - 現在のエントリに bufferの indexから
lengthバイトのデータを書き出す。
|
void | write(int data) - 現在のエントリに1バイトのデータを書きこむ。
|
LhaImmediateOutputStream
public LhaImmediateOutputStream(File filename)
throws IOException
filename のファイルに 圧縮データを出力するOutputStreamを構築する。
各圧縮形式に対応した符号器の生成式等を持つプロパティには
LhaProperty.getProperties() で得られたプロパティが使用される。
filename
- 圧縮データを書きこむファイルの名前
LhaImmediateOutputStream
public LhaImmediateOutputStream(File filename,
Properties property)
throws IOException
filename のファイルに 圧縮データを出力するOutputStreamを構築する。
filename
- 圧縮データを書きこむファイルの名前property
- 各圧縮形式に対応した符号器の生成式等が含まれるプロパティ
LhaImmediateOutputStream
public LhaImmediateOutputStream(RandomAccessFile file)
fileに 圧縮データを出力するOutputStreamを構築する。
各圧縮形式に対応した符号器の生成式等を持つプロパティには
LhaProperty.getProperties() で得られたプロパティが使用される。
file
- RandomAccessFile のインスタンス。
- 既に close() されていない事。
- コンストラクタの mode には "rw" オプションを使用して、
読みこみと書きこみが出来るように生成されたインスタンスであること。
の条件を満たすもの。
LhaImmediateOutputStream
public LhaImmediateOutputStream(RandomAccessFile file,
Properties property)
fileに 圧縮データを出力するOutputStreamを構築する。
各圧縮形式に対応した符号器の生成式等を持つプロパティには
LhaProperty.getProperties() で得られたプロパティが使用される。
file
- RandomAccessFile のインスタンス。
- 既に close() されていない事。
- コンストラクタの mode には "rw" オプションを使用して、
読みこみと書きこみが出来るように生成されたインスタンスであること。
の条件を満たすもの。property
- 各圧縮形式に対応した符号器の生成式等が含まれるプロパティ
LhaImmediateOutputStream
public LhaImmediateOutputStream(String filename)
throws FileNotFoundException
filename のファイルに 圧縮データを出力するOutputStreamを構築する。
各圧縮形式に対応した符号器の生成式等を持つプロパティには
LhaProperty.getProperties() で得られたプロパティが使用される。
filename
- 圧縮データを書きこむファイルの名前
LhaImmediateOutputStream
public LhaImmediateOutputStream(String filename,
Properties property)
throws FileNotFoundException
filename のファイルに 圧縮データを出力するOutputStreamを構築する。
filename
- 圧縮データを書きこむファイルの名前property
- 各圧縮形式に対応した符号器の生成式等が含まれるプロパティ
close
public void close()
throws IOException
出力先に全てのデータを出力し、ストリームを閉じる。
また、使用していた全てのリソースを解放する。
closeEntry
public boolean closeEntry()
throws IOException
現在出力中のエントリを閉じ、次のエントリが出力可能な状態にする。
putNextEntryNotYetCompressed() で開いたエントリを閉じる場合
このメソッドは圧縮に失敗した(圧縮後サイズが圧縮前サイズを上回った)場合、
エントリ全体を書き込み先 の RandomAccessFile から削除する。
この削除処理は単に ファイルポインタを エントリ開始位置まで巻き戻すだけなので
RandomAccessFile に setLength() が無い jdk1.1 以前では
エントリを無圧縮(もしくは他の圧縮法)で再出力しない場合、
書庫データの終端以降に圧縮に失敗した不完全なデータが残ったままになる。
- エントリが出力された場合は true、
圧縮前よりも圧縮後の方がサイズが大きくなったため、
エントリが削除された場合は false。
また、現在処理中のエントリが無かった場合も true を返す。
flush
public void flush()
throws IOException
現在書き込み中のエントリのデータを強§的に出力先に書き出す。
これは PostLzssEncoder, LzssOutputStream の規約どおり
flush() しなかった場合とは別のデータを出力する。
(大抵の場合は 単に圧縮率が低下するだけである。)
putNextEntry
public void putNextEntry(LhaHeader header)
throws IOException
新しいエントリを書き込むようにストリームを設定する。
このメソッドは 既に圧縮済みのエントリの場合は
putNextEntryAlreadyCompressed(),
未だに圧縮されていない場合は
putNextEntryNotYetCompressed() を呼び出す。
圧縮されているかの判定は、
- header.getCompressedSize()
- header.getCRC()
のどれか一つでも LhaHeader.UNKNOWN であれば未だに圧縮されていないとする。
header には正確な OriginalSize が指定されている必要がある。
header
- 書きこむエントリについての情報を持つ
LhaHeaderのインスタンス。
putNextEntryAlreadyCompressed
public void putNextEntryAlreadyCompressed(LhaHeader header)
throws IOException
既に圧縮済みのエントリを書きこむようにストリームを設定する。
圧縮済みデータが正しい事は、呼び出し側が保証する事。
header
- 書きこむエントリについての情報を持つ
LhaHeaderのインスタンス。
putNextEntryNotYetCompressed
public void putNextEntryNotYetCompressed(LhaHeader header)
throws IOException
未だに圧縮されていないエントリを書きこむようにストリームを
設定する。header に CompressedSize,CRCが指定されていても無
視される。このメソッドに渡される header には
LhaHeader.setOriginalSize() を用いて 正確なオリジナルサイズ
が指定されている必要がある。
header
- 書きこむエントリについての情報を持つ
LhaHeaderのインスタンス。
write
public void write(byte[] buffer)
throws IOException
現在のエントリに bufferの内容を全て書き出す。
buffer
- 書き出すデータの入ったバイト配列
write
public void write(byte[] buffer,
int index,
int length)
throws IOException
現在のエントリに bufferの indexから
lengthバイトのデータを書き出す。
buffer
- 書き出すデータの入ったバイト配列index
- buffer内の書き出すべきデータの開始位置length
- データのバイト数
write
public void write(int data)
throws IOException
現在のエントリに1バイトのデータを書きこむ。
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.