LHA Library for Java

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

java.lang.Object
  拡張jp.gr.java_conf.dangan.util.lha.LhaHeader
すべての実装インタフェース:
Cloneable

public class LhaHeader
extends Object
implements Cloneable

LHAヘッダを扱う。
このクラスは java.util.zip パッケージでは ZipEntry と近いが、 ヘッダの入出力のためのユーティリティ関数を持つ点が違う。
このクラスは set系メソッドで為された方が良いチェックを getBytes() 時に行うように書かれている。その点は注意すること。

 -- revision history --
 $Log: LhaHeader.java,v $
 Revision 1.2.2.3  2005/05/03 07:50:30  dangan
 [bug fix]
     exportLevel1Header() で skip size のチェックがされていなかった。

 Revision 1.2.2.2  2005/02/02 00:57:46  dangan
 [bug fix]
     importLevelXHeader(byte[], String) でファイルサイズを int で読み込んでいたため
     31ビット値以上のサイズのファイルを正しく扱えていなかったのを修正。

 Revision 1.2.2.1  2003/07/20 13:19:21  dangan
 [bug fix]
     exportDirNameExtHeader(String) で System.arraycopy の src と dest の配置が間違っていた。

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

 Revision 1.1  2002/12/05 00:00:00  dangan
 [improvement]
     64ビットファイルサイズヘッダに対応。
 [change]
     LhaUtil.DefaultEncoding から LhaProperty.encoding を使用するように変更。
     getNextHeaderData() を getFirstHeaderData() に名前変更。
     新しい getNextHeaderData() は呼び出された位置で
     ヘッダを発見できない場合 null を返す。
     LhaHeader を拡張したサブクラスを使用する人のための createInstance() を追加。

 Revision 1.0  2002/08/05 00:00:00  dangan
 add to version control
 [bug fix]
     setDate( null ) を許していた。
     setCompressMethod( null ) を許していた。
     exportLevel2,3Header で
     Date が 32bit の time_t の範囲外の値(負の値を含む)の場合を許していた。
 [change]
     exportHeader で ヘッダレベルが 0,1,2,3 のいずれでもない場合
     IllegalStateException を投げるように変更。
 [maintenance]
     ソース整備
     タブ廃止
     ライセンス文の修正

 

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

フィールドの概要
static int NO_CRC
          CRC値が無い事を意味する値。
static int UNKNOWN
          不明を意味する値。
 
コンストラクタの概要
LhaHeader(byte[] HeaderData)
          ヘッダデータから 新しい LhaHeader の インスタンスを生成する。
LhaHeader(byte[] HeaderData, String encode)
          ヘッダデータから 新しい LhaHeader の インスタンスを生成する。
LhaHeader(String path)
          path という名前を持つ LhaHeader のインスタンスを生成する。
LhaHeader(String path, Date date)
          path という名前を持ち、最終更新日時が date の LhaHeader のインスタンスを生成する。
 
メソッドの概要
static boolean checkHeaderData(byte[] HeaderData)
          ヘッダデータが正当であるかをチェックする。
 Object clone()
          このオブジェクトのコピーを作成して返す。
static LhaHeader createInstance(byte[] HeaderData, Properties property)
          property の キー"lha.header" に結び付けられた生成式を使用して HeaderData から LhaHeader のインスタンスを生成する。
protected  byte[][] exportExtendHeaders(String encode)
          拡張ヘッダをバイト配列の形にして出力する。
 byte[] getBytes()
          このLhaHeaderのデータを使用して ヘッダデータを生成し、 それをバイト配列の形で得る。
 byte[] getBytes(String encode)
          このLhaHeaderのデータを使用して ヘッダデータを生成し、 それをバイト配列の形で得る。
 long getCompressedSize()
          データの圧縮後のサイズを得る。
 String getCompressMethod()
          データを圧縮した方法を識別する文字列を得る。
 int getCRC()
          データのCRC16値を得る。
protected  byte[] getExtraData()
          レベル 0 ヘッダ、 レベル 1 ヘッダの時に 付加される可能性がある基本ヘッダ内の拡張データを得る。
static byte[] getFirstHeaderData(InputStream in)
          入力ストリームから 最初のヘッダを読み込む。
 int getHeaderLevel()
          このヘッダのヘッダレベルを得る。
 Date getLastModified()
          データの最終更新日時を得る。
protected  byte getLevel0DosAttribute()
          レベル 0 ヘッダに記される DOS のファイル属性を得る。
static byte[] getNextHeaderData(InputStream in)
          入力ストリームから 次のヘッダを読み込む。
 long getOriginalSize()
          データの圧縮前のサイズを得る。
 byte getOSID()
          このヘッダを作成した OS の識別子を得る。
 String getPath()
          データの名前、 もしくはデータがファイルであった場合のパス名を得る。
protected  void importExtendHeader(byte[] HeaderData, int index, int length, String encode)
          拡張ヘッダを読み込む。
 void setCompressedSize(long size)
          圧縮後データサイズを設定する。
 void setCompressMethod(String method)
          圧縮法文字列を設定する。
 void setCRC(int crc)
          圧縮前のデータの CRC16値を設定する。
protected  void setExtraData(byte[] data)
          レベル 0,1ヘッダ時に使用される 基本ヘッダ内 拡張情報を設定する。
 void setHeaderLevel(int level)
          ヘッダレベルを設定する。
 void setLastModified(Date date)
          圧縮データの最終更新日時を設定する。
protected  void setLevel0DosAttribute(byte attribute)
          レベル 0ヘッダの場合に出力される、 MS-DOS のファイル属性を設定する。
 void setOriginalSize(long size)
          圧縮前データサイズを設定する。
 void setOSID(byte id)
          このヘッダにOS固有の情報が含まれる場合、 そのデータを解釈する手がかりとして OSの識別子を設定する。
 void setPath(String path)
          データの名前、もしくはデータがファイルである場合、 データのパスを設定する。
 
クラス java.lang.Object から継承したメソッド
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

フィールドの詳細

UNKNOWN

public static final int UNKNOWN
不明を意味する値。 LhaHeader.getCRC(), LhaHeader.getCompressedSize(), LhaHeader.getOriginalSzie() がこの値を返した場合は 処理前のために、その値が不明である事を示す。

関連項目:
定数フィールド値

NO_CRC

public static final int NO_CRC
CRC値が無い事を意味する値。 レベル0ヘッダでCRC値が存在しない事を意味する。

関連項目:
定数フィールド値
コンストラクタの詳細

LhaHeader

public LhaHeader(String path)
path という名前を持つ LhaHeader のインスタンスを生成する。
パスデリミタには File.separator を使用すること。
path が パスデリミタでターミネートされている場合は ディレクトリであると解釈される。

パラメータ:
path - パス名
例外:
IllgelArgumentException - path が null か 空文字列のいずれかである場合

LhaHeader

public LhaHeader(String path,
                 Date date)
path という名前を持ち、最終更新日時が date の LhaHeader のインスタンスを生成する。
パスデリミタには File.separator を使用すること。
path が パスデリミタでターミネートされている場合は ディレクトリであると解釈される。

パラメータ:
path - パス名
date - 最終更新日時
例外:
IllgelArgumentException - path が null か 空文字列のいずれかであるか、 date が nullである場合。

LhaHeader

public LhaHeader(byte[] HeaderData)
ヘッダデータから 新しい LhaHeader の インスタンスを生成する。
エンコードは LhaUtil.DefaultEncode が使用される。

パラメータ:
HeaderData - ヘッダデータ
例外:
IndexOutOfBoundsException - ヘッダデータが壊れているため データがあると仮定した位置が HeaderData の範囲外になった
IllegalArgumentException - ヘッダレベルが 0,1,2,3 の何れでもないか、 HeaderData が null の場合

LhaHeader

public LhaHeader(byte[] HeaderData,
                 String encode)
          throws UnsupportedEncodingException
ヘッダデータから 新しい LhaHeader の インスタンスを生成する。

パラメータ:
HeaderData - ヘッダデータ
encode - 文字列情報を解釈する際に使用する エンコード
例外:
IndexOutOfBoundsException - ヘッダデータが壊れているため データがあると仮定した位置が HeaderData の範囲外になった
UnsupportedEncodingException - encode で指定されたエンコードが サポートされない場合
IllegalArgumentException - ヘッダレベルが 0,1,2,3 の何れでもないか、 HeaderData が null の場合
メソッドの詳細

clone

public Object clone()
このオブジェクトのコピーを作成して返す。

戻り値:
このオブジェクトのコピー

getCompressMethod

public String getCompressMethod()
データを圧縮した方法を識別する文字列を得る。

戻り値:
圧縮法文字列

getOriginalSize

public long getOriginalSize()
データの圧縮前のサイズを得る。

戻り値:
圧縮前のサイズ
LhaHeader( String path ) または LhaHeader( String path, Date date )で生成された インスタンスは初期状態ではサイズが不明のため LhaHeader.UNKNOWN( -1 ) を返す。
関連項目:
UNKNOWN

getCompressedSize

public long getCompressedSize()
データの圧縮後のサイズを得る。

戻り値:
圧縮後のサイズ
LhaHeader( String path ) または LhaHeader( String path, Date date )で生成された インスタンスは初期状態ではサイズが不明のため LhaHeader.UNKNOWN( -1 ) を返す。
関連項目:
UNKNOWN

getLastModified

public Date getLastModified()
データの最終更新日時を得る。

戻り値:
データの最終更新日時

getHeaderLevel

public int getHeaderLevel()
このヘッダのヘッダレベルを得る。

戻り値:
ヘッダレベル

getPath

public String getPath()
データの名前、 もしくはデータがファイルであった場合のパス名を得る。
パス名とはいっても、Windows 系の A: のような ドライブ名を含んではならない。
パスデリミタには File.separator を使用する。

戻り値:
データの名前、もしくは パス名。
関連項目:
File.separator

getCRC

public int getCRC()
データのCRC16値を得る。

戻り値:
データのCRC16値
LhaHeader( String path ) または LhaHeader( String path, Date date )で生成された インスタンスは初期状態ではCRCが不明のため LhaHeader.UNKNOWN( -1 ) を返す。
レベル0ヘッダでCRC16値の フィールドが無い場合は LhaHeader.NO_CRC( -2 )を返す
関連項目:
UNKNOWN, NO_CRC

getOSID

public byte getOSID()
このヘッダを作成した OS の識別子を得る。

戻り値:
OSの識別子

getExtraData

protected byte[] getExtraData()
レベル 0 ヘッダ、 レベル 1 ヘッダの時に 付加される可能性がある基本ヘッダ内の拡張データを得る。

戻り値:
拡張データ

getLevel0DosAttribute

protected byte getLevel0DosAttribute()
レベル 0 ヘッダに記される DOS のファイル属性を得る。

戻り値:
DOS の ファイル属性

getBytes

public byte[] getBytes()
このLhaHeaderのデータを使用して ヘッダデータを生成し、 それをバイト配列の形で得る。
エンコードはデフォルトのものが使用される。

戻り値:
バイト配列に格納したヘッダデータ
例外:
IllegalStateException -
  1. 圧縮法文字列をencodeでバイト配列に したものが 5byteで無い場合
  2. レベル0,1,2で ファイル名が長すぎるため ヘッダに収まりきらない。
  3. レベル1,2で共通拡張ヘッダが大きすぎて出力できない。 そのためヘッダのCRC格納場所が無い。
  4. レベル0以外で CRC に レベル0ヘッダで CRC情報が無い事を示す特別な値である LhaHeader.NO_CRC( -2 ) が設定されていた。
  5. レベル0,1の時にLastModifiedがMS-DOS形式 で表現できない範囲の時間であった場合
  6. レベル2,3の時にLastModifiedが4バイトの time_tで表現できない範囲の時間であった場合
  7. OriginalSize にサイズが不明である事を示す 特別な値である LhaHeader.UNKNOWN( -1 )が設定されていた。
  8. OriginalSize が負値である場合
  9. レベル0,1,3 の時に OriginalSize が 4byte値で表現できない値である場合
  10. CompressedSize にサイズが不明である事を示す 特別な値である LhaHeader.UNKNOWN( -1 )が設定されていた。
  11. CompressedSize が負値である場合
  12. レベル0,1,3 の時に CompressedSize が 4byte値で表現できない値である場合
  13. レベル2の時にOriginalSize または CompressedSizeが 4バイト値を超えるためファイルサイズヘッダが必要な際に 他の拡張ヘッダが大きすぎてファイルサイズヘッダが出力出来ない場合。
  14. CRC にCRC16値が不明である事を示す 特別な値である LhaHeader.UNKNOWN( -1 )が設定されていた。
  15. ヘッダレベルが 0,1,2,3 以外である場合
の何れか。

getBytes

public byte[] getBytes(String encode)
                throws UnsupportedEncodingException
このLhaHeaderのデータを使用して ヘッダデータを生成し、 それをバイト配列の形で得る。

パラメータ:
encode - 文字列情報を出力する際に使用する エンコード
戻り値:
バイト配列に格納したヘッダデータ
例外:
IllegalStateException -
  1. 圧縮法文字列をencodeでバイト配列に したものが 5byteで無い場合
  2. レベル0,1,2で ファイル名が長すぎるため ヘッダに収まりきらない。
  3. レベル1,2で共通拡張ヘッダが大きすぎて出力できない。 そのためヘッダのCRC格納場所が無い。
  4. レベル0以外で CRC に レベル0ヘッダで CRC情報が無い事を示す特別な値である LhaHeader.NO_CRC( -2 ) が設定されていた。
  5. レベル0,1の時にLastModifiedがMS-DOS形式 で表現できない範囲の時間であった場合
  6. レベル2,3の時にLastModifiedが4バイトの time_tで表現できない範囲の時間であった場合
  7. OriginalSize にサイズが不明である事を示す 特別な値である LhaHeader.UNKNOWN( -1 )が設定されていた。
  8. OriginalSize が負値である場合
  9. レベル0,1,3 の時に OriginalSize が 4byte値で表現できない値である場合
  10. CompressedSize にサイズが不明である事を示す 特別な値である LhaHeader.UNKNOWN( -1 )が設定されていた。
  11. CompressedSize が負値である場合
  12. レベル0,1,3 の時に CompressedSize が 4byte値で表現できない値である場合
  13. レベル2の時にOriginalSize または CompressedSizeが 4バイト値を超えるためファイルサイズヘッダが必要な際に 他の拡張ヘッダが大きすぎてファイルサイズヘッダが出力出来ない場合。
  14. CRC にCRC16値が不明である事を示す 特別な値である LhaHeader.UNKNOWN( -1 )が設定されていた。
  15. ヘッダレベルが 0,1,2,3 以外である場合
の何れか。
UnsupportedEncodingException - encode で指定されたエンコードが サポートされない場合

setCompressMethod

public void setCompressMethod(String method)
圧縮法文字列を設定する。

パラメータ:
method - 圧縮法文字列
例外:
IllegalArgumentException - 圧縮法文字列が '-' で始まっていないか、 '-' で終わっていない場合。

setOriginalSize

public void setOriginalSize(long size)
圧縮前データサイズを設定する。
LhaHeader.UNKNOWN( -1 ) は サイズ不明を示す 特別な数字であるため設定できない。
また レベル0,1,3 では処理できるのは 4バイト値のみであるため 4バイトで表現できない値を設定した場合 getByte() 時に例外を投げる。

パラメータ:
size - 圧縮前データサイズ
例外:
IllegalArgumentException - size に LhaHeader.UNKNOWN( -1 )を設定しようとした場合
関連項目:
UNKNOWN

setCompressedSize

public void setCompressedSize(long size)
圧縮後データサイズを設定する。
LhaHeader.UNKNOWN( -1 ) は サイズ不明を示す 特別な数字であるため設定できない。
また レベル0,1,3 では処理できるのは 4バイト値のみであるため 4バイトで表現できない値を設定した場合 getByte() 時に例外を投げる。

パラメータ:
size - 圧縮後データサイズ
例外:
IllegalArgumentException - size に LhaHeader.UNKNOWN を設定しようとした
関連項目:
UNKNOWN

setLastModified

public void setLastModified(Date date)
圧縮データの最終更新日時を設定する。
ヘッダレベルが 0,1 の場合は MsdosDateで表せる範囲内、 ヘッダレベルが 2,3 の場合は 4byte の time_tで表せる範囲内 の日付で無ければならない。
範囲内でなくても このメソッドは例外を投げないことに注意す ること。範囲内に無い場合は このメソッドは例外を投げないが、 getBytes() 時に例外を投げる。

パラメータ:
date - 最終更新日時
例外:
IllegalArgumentException - date に null を設定しようとした場合

setHeaderLevel

public void setHeaderLevel(int level)
ヘッダレベルを設定する。
現在設定できるのは 0,1,2,3 のみとなっている。
ヘッダレベルの変更はパスの最大長や、LastModified の制限範囲 などを変化させるため注意が必要である。

パラメータ:
level - ヘッダレベル

setPath

public void setPath(String path)
データの名前、もしくはデータがファイルである場合、 データのパスを設定する。
パスデリミタには File.separator を使用する。
ヘッダレベルによって path にはバイト数の制限が存在するが、 このメソッドは制限を越えた場合でも 例外を投げないことに 注意。制限を越えた場合は このメソッドは例外を投げないが、 getBytes()時に例外を投げる

パラメータ:
path - データの名前、もしくはファイル名
例外:
IllegalArgumentException - path が空文字列である場合
関連項目:
File.separator

setCRC

public void setCRC(int crc)
圧縮前のデータの CRC16値を設定する。
LhaHeader.UNKNOWN( -1 ) は サイズ不明を示す 特別な数字であるため設定できない。
LhaHeader.NO_CRC( -2 ) は レベル0ヘッダの場 合に CRC値を出力しないことを意味する特別な値 である。
他のヘッダレベルの時に LhaHeader.NO_CRC( -2 ) を設定しても例外を投げないが getBytes() 時に 例外を投げるので注意すること。
有効なのは下位2バイトで、上位2バイトは無視される。

パラメータ:
crc - データの圧縮前のCRC16値
例外:
IllegalArgumentException - crc に LhaHeader.UNKNOWN を設定しようとした
関連項目:
UNKNOWN, NO_CRC

setOSID

public void setOSID(byte id)
このヘッダにOS固有の情報が含まれる場合、 そのデータを解釈する手がかりとして OSの識別子を設定する。

パラメータ:
id - OS識別子

setExtraData

protected void setExtraData(byte[] data)
レベル 0,1ヘッダ時に使用される 基本ヘッダ内 拡張情報を設定する。
拡張情報のバイト数には制限が存在するが、このメソッドは 制限を越えても例外を投げないことに注意。制限を越えた場合 getBytes()時に例外を投げる。

パラメータ:
data - 拡張情報 拡張情報を出力しない場合は nullを設定する。

setLevel0DosAttribute

protected void setLevel0DosAttribute(byte attribute)
レベル 0ヘッダの場合に出力される、 MS-DOS のファイル属性を設定する。

パラメータ:
attribute - MS-DOSのファイル属性

importExtendHeader

protected void importExtendHeader(byte[] HeaderData,
                                  int index,
                                  int length,
                                  String encode)
                           throws UnsupportedEncodingException
拡張ヘッダを読み込む。 このメソッドをオーバーライドする事によって 様々な拡張ヘッダに対応することが可能となる。 LhaHeader では 拡張ヘッダを private メンバである ExtraExtHeaders に登録するだけである。

パラメータ:
HeaderData - ヘッダデータ
index - HeaderData内の拡張ヘッダの開始位置
length - 拡張ヘッダの長さ
encode - 文字列情報を解釈する際に使用する エンコード
例外:
UnsupportedEncodingException - encode で指定されたエンコードが サポートされない場合

exportExtendHeaders

protected byte[][] exportExtendHeaders(String encode)
                                throws UnsupportedEncodingException
拡張ヘッダをバイト配列の形にして出力する。 このメソッドをオーバーライドする事によって 様々な拡張ヘッダに対応することが可能となる。 LhaHeader では private メンバである ExtraExtHeaders に登録された拡張ヘッダの情報を 返すだけである。 出力の形式は 第一バイト目に拡張ヘッダ識別子 続いて、拡張ヘッダデータが格納され、 次の拡張ヘッダの大きさは添付されない。

パラメータ:
encode - 文字列情報を出力する際に使用する エンコード
戻り値:
1つの拡張ヘッダを1つのバイト配列に格納し、 それを配列の形にしたもの
例外:
UnsupportedEncodingException - encode で指定されたエンコードが サポートされない場合

checkHeaderData

public static boolean checkHeaderData(byte[] HeaderData)
ヘッダデータが正当であるかをチェックする。

パラメータ:
HeaderData - ヘッダデータをバイト配列に格納したもの
戻り値:
ヘッダデータが正当であれば true 違えば false

getFirstHeaderData

public static byte[] getFirstHeaderData(InputStream in)
                                 throws IOException
入力ストリームから 最初のヘッダを読み込む。
このメソッドはレベル1ヘッダ、もしくは レベル3ヘッダに 似たデータが存在すると、ヘッダ全てを読み込もうとして in.mark( 65536 ) の 限界を超えて 読み込む可能性があり、 その結果 reset() できずに その間のデータを読み落とす 可能性がある。
また、InputStream のmark/reset の実装次第では ストリーム終端付近で ヘッダに似たデータが存在すると ヘッダを全て読み込もうとして EndOfStreamに達してしまい、 reset()できずに その間のデータを読み落とす可能性がある。

パラメータ:
in - ヘッダデータを読み込む入力ストリーム ストリームは mark/resetのサポートを必要とする。
戻り値:
読み取られたヘッダデータ
ヘッダが見つからずに EndOfStream に達した場合は null
例外:
IOException - 入出力エラーが発生した場合
IllegalArgumentException - in が mark/resetをサポートしない場合

getNextHeaderData

public static byte[] getNextHeaderData(InputStream in)
                                throws IOException
入力ストリームから 次のヘッダを読み込む。
このメソッドはレベル1ヘッダ、もしくは レベル3ヘッダに 似たデータが存在すると、ヘッダ全てを読み込もうとして in.mark( 65536 ) の 限界を超えて 読み込む可能性があり、 その結果 reset() できずに その間のデータを読み落とす 可能性がある。
また、ストリーム終端付近で ヘッダに似たデータが存在する と ヘッダを全て読み込もうとして EndOfStreamに達してしまい、 reset()できずに その間のデータを読み落とす可能性がある。

パラメータ:
in - ヘッダデータを読み込む入力ストリーム ストリームは mark/resetのサポートを必要とする。
戻り値:
読み取られたヘッダデータ
ヘッダが見つからずに EndOfStream に達した場合は null
例外:
IOException - 入出力エラーが発生した場合
IllegalArgumentException - in が mark/resetをサポートしない場合

createInstance

public static LhaHeader createInstance(byte[] HeaderData,
                                       Properties property)
property の キー"lha.header" に結び付けられた生成式を使用して HeaderData から LhaHeader のインスタンスを生成する。

パラメータ:
HeaderData - ヘッダのデータを持つバイト配列
property - LhaProperty.parse() で LhaHeader のインスタンスが生成できるような 生成式を キー"lha.header" の値として持つプロパティ
戻り値:
LhaHeader のインスタンス

LHA Library for Java

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