|
LHA Library for Java | |||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||
java.lang.Objectjp.gr.java_conf.dangan.util.lha.LhaHeader
public class LhaHeader
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]
ソース整備
タブ廃止
ライセンス文の修正
| Field Summary | |
|---|---|
static int |
NO_CRC
CRC値が無い事を意味する値。 レベル0ヘッダでCRC値が存在しない事を意味する。 |
static int |
UNKNOWN
不明を意味する値。 LhaHeader.getCRC(), LhaHeader.getCompressedSize(), LhaHeader.getOriginalSzie() がこの値を返した場合は 処理前のために、その値が不明である事を示す。 |
| Constructor Summary | |
|---|---|
LhaHeader(byte[] HeaderData)
ヘッダデータから 新しい LhaHeader の インスタンスを生成する。 エンコードは LhaUtil.DefaultEncode が使用される。 |
|
LhaHeader(byte[] HeaderData,
java.lang.String encode)
ヘッダデータから 新しい LhaHeader の インスタンスを生成する。 |
|
LhaHeader(java.lang.String path)
path という名前を持つ LhaHeader のインスタンスを生成する。 パスデリミタには File.separator を使用すること。 path が パスデリミタでターミネートされている場合は ディレクトリであると解釈される。 |
|
LhaHeader(java.lang.String path,
java.util.Date date)
path という名前を持ち、最終更新日時が date の LhaHeader のインスタンスを生成する。 パスデリミタには File.separator を使用すること。 path が パスデリミタでターミネートされている場合は ディレクトリであると解釈される。 |
|
| Method Summary | |
|---|---|
static boolean |
checkHeaderData(byte[] HeaderData)
ヘッダデータが正当であるかをチェックする。 |
java.lang.Object |
clone()
このオブジェクトのコピーを作成して返す。 |
static LhaHeader |
createInstance(byte[] HeaderData,
java.util.Properties property)
property の キー"lha.header" に結び付けられた生成式を使用して HeaderData から LhaHeader のインスタンスを生成する。 |
protected byte[][] |
exportExtendHeaders(java.lang.String encode)
拡張ヘッダをバイト配列の形にして出力する。 このメソッドをオーバーライドする事によって 様々な拡張ヘッダに対応することが可能となる。 LhaHeader では private メンバである ExtraExtHeaders に登録された拡張ヘッダの情報を 返すだけである。 出力の形式は 第一バイト目に拡張ヘッダ識別子 続いて、拡張ヘッダデータが格納され、 次の拡張ヘッダの大きさは添付されない。 |
byte[] |
getBytes()
このLhaHeaderのデータを使用して ヘッダデータを生成し、 それをバイト配列の形で得る。 エンコードはデフォルトのものが使用される。 |
byte[] |
getBytes(java.lang.String encode)
このLhaHeaderのデータを使用して ヘッダデータを生成し、 それをバイト配列の形で得る。 |
long |
getCompressedSize()
データの圧縮後のサイズを得る。 |
java.lang.String |
getCompressMethod()
データを圧縮した方法を識別する文字列を得る。 |
int |
getCRC()
データのCRC16値を得る。 |
protected byte[] |
getExtraData()
レベル 0 ヘッダ、 レベル 1 ヘッダの時に 付加される可能性がある基本ヘッダ内の拡張データを得る。 |
static byte[] |
getFirstHeaderData(java.io.InputStream in)
入力ストリームから 最初のヘッダを読み込む。 このメソッドはレベル1ヘッダ、もしくは レベル3ヘッダに 似たデータが存在すると、ヘッダ全てを読み込もうとして in.mark( 65536 ) の 限界を超えて 読み込む可能性があり、 その結果 reset() できずに その間のデータを読み落とす 可能性がある。 また、InputStream のmark/reset の実装次第では ストリーム終端付近で ヘッダに似たデータが存在すると ヘッダを全て読み込もうとして EndOfStreamに達してしまい、 reset()できずに その間のデータを読み落とす可能性がある。 |
int |
getHeaderLevel()
このヘッダのヘッダレベルを得る。 |
java.util.Date |
getLastModified()
データの最終更新日時を得る。 |
protected byte |
getLevel0DosAttribute()
レベル 0 ヘッダに記される DOS のファイル属性を得る。 |
static byte[] |
getNextHeaderData(java.io.InputStream in)
入力ストリームから 次のヘッダを読み込む。 このメソッドはレベル1ヘッダ、もしくは レベル3ヘッダに 似たデータが存在すると、ヘッダ全てを読み込もうとして in.mark( 65536 ) の 限界を超えて 読み込む可能性があり、 その結果 reset() できずに その間のデータを読み落とす 可能性がある。 また、ストリーム終端付近で ヘッダに似たデータが存在する と ヘッダを全て読み込もうとして EndOfStreamに達してしまい、 reset()できずに その間のデータを読み落とす可能性がある。 |
long |
getOriginalSize()
データの圧縮前のサイズを得る。 |
byte |
getOSID()
このヘッダを作成した OS の識別子を得る。 |
java.lang.String |
getPath()
データの名前、 もしくはデータがファイルであった場合のパス名を得る。 パス名とはいっても、Windows 系の A: のような ドライブ名を含んではならない。 パスデリミタには File.separator を使用する。 |
protected void |
importExtendHeader(byte[] HeaderData,
int index,
int length,
java.lang.String encode)
拡張ヘッダを読み込む。 このメソッドをオーバーライドする事によって 様々な拡張ヘッダに対応することが可能となる。 LhaHeader では 拡張ヘッダを private メンバである ExtraExtHeaders に登録するだけである。 |
void |
setCompressedSize(long size)
圧縮後データサイズを設定する。 LhaHeader.UNKNOWN( -1 ) は サイズ不明を示す 特別な数字であるため設定できない。 また レベル0,1,3 では処理できるのは 4バイト値のみであるため 4バイトで表現できない値を設定した場合 getByte() 時に例外を投げる。 |
void |
setCompressMethod(java.lang.String method)
圧縮法文字列を設定する。 |
void |
setCRC(int crc)
圧縮前のデータの CRC16値を設定する。 LhaHeader.UNKNOWN( -1 ) は サイズ不明を示す 特別な数字であるため設定できない。 LhaHeader.NO_CRC( -2 ) は レベル0ヘッダの場 合に CRC値を出力しないことを意味する特別な値 である。 他のヘッダレベルの時に LhaHeader.NO_CRC( -2 ) を設定しても例外を投げないが getBytes() 時に 例外を投げるので注意すること。 有効なのは下位2バイトで、上位2バイトは無視される。 |
protected void |
setExtraData(byte[] data)
レベル 0,1ヘッダ時に使用される 基本ヘッダ内 拡張情報を設定する。 拡張情報のバイト数には制限が存在するが、このメソッドは 制限を越えても例外を投げないことに注意。制限を越えた場合 getBytes()時に例外を投げる。 |
void |
setHeaderLevel(int level)
ヘッダレベルを設定する。 現在設定できるのは 0,1,2,3 のみとなっている。 ヘッダレベルの変更はパスの最大長や、LastModified の制限範囲 などを変化させるため注意が必要である。 |
void |
setLastModified(java.util.Date date)
圧縮データの最終更新日時を設定する。 ヘッダレベルが 0,1 の場合は MsdosDateで表せる範囲内、 ヘッダレベルが 2,3 の場合は 4byte の time_tで表せる範囲内 の日付で無ければならない。 範囲内でなくても このメソッドは例外を投げないことに注意す ること。範囲内に無い場合は このメソッドは例外を投げないが、 getBytes() 時に例外を投げる。 |
protected void |
setLevel0DosAttribute(byte attribute)
レベル 0ヘッダの場合に出力される、 MS-DOS のファイル属性を設定する。 |
void |
setOriginalSize(long size)
圧縮前データサイズを設定する。 LhaHeader.UNKNOWN( -1 ) は サイズ不明を示す 特別な数字であるため設定できない。 また レベル0,1,3 では処理できるのは 4バイト値のみであるため 4バイトで表現できない値を設定した場合 getByte() 時に例外を投げる。 |
void |
setOSID(byte id)
このヘッダにOS固有の情報が含まれる場合、 そのデータを解釈する手がかりとして OSの識別子を設定する。 |
void |
setPath(java.lang.String path)
データの名前、もしくはデータがファイルである場合、 データのパスを設定する。 パスデリミタには File.separator を使用する。 ヘッダレベルによって path にはバイト数の制限が存在するが、 このメソッドは制限を越えた場合でも 例外を投げないことに 注意。制限を越えた場合は このメソッドは例外を投げないが、 getBytes()時に例外を投げる |
| Methods inherited from class java.lang.Object |
|---|
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
|---|
public static final int UNKNOWN
public static final int NO_CRC
| Constructor Detail |
|---|
public LhaHeader(java.lang.String path)
path - パス名
IllgelArgumentException - path が null か 空文字列のいずれかである場合
public LhaHeader(java.lang.String path,
java.util.Date date)
path - パス名date - 最終更新日時
IllgelArgumentException - path が null か 空文字列のいずれかであるか、
date が nullである場合。public LhaHeader(byte[] HeaderData)
HeaderData - ヘッダデータ
java.lang.IndexOutOfBoundsException - ヘッダデータが壊れているため
データがあると仮定した位置が
HeaderData の範囲外になった
java.lang.IllegalArgumentException - ヘッダレベルが 0,1,2,3 の何れでもないか、
HeaderData が null の場合
public LhaHeader(byte[] HeaderData,
java.lang.String encode)
throws java.io.UnsupportedEncodingException
HeaderData - ヘッダデータencode - 文字列情報を解釈する際に使用する
エンコード
java.lang.IndexOutOfBoundsException - ヘッダデータが壊れているため
データがあると仮定した位置が
HeaderData の範囲外になった
java.io.UnsupportedEncodingException - encode で指定されたエンコードが
サポートされない場合
java.lang.IllegalArgumentException - ヘッダレベルが 0,1,2,3 の何れでもないか、
HeaderData が null の場合| Method Detail |
|---|
public java.lang.Object clone()
clone in class java.lang.Objectpublic java.lang.String getCompressMethod()
public long getOriginalSize()
UNKNOWNpublic long getCompressedSize()
UNKNOWNpublic java.util.Date getLastModified()
public int getHeaderLevel()
public java.lang.String getPath()
File.separatorpublic int getCRC()
UNKNOWN,
NO_CRCpublic byte getOSID()
protected byte[] getExtraData()
protected byte getLevel0DosAttribute()
public byte[] getBytes()
java.lang.IllegalStateException -
public byte[] getBytes(java.lang.String encode)
throws java.io.UnsupportedEncodingException
encode - 文字列情報を出力する際に使用する
エンコード
java.lang.IllegalStateException - java.io.UnsupportedEncodingException - encode で指定されたエンコードが
サポートされない場合public void setCompressMethod(java.lang.String method)
method - 圧縮法文字列
java.lang.IllegalArgumentException - 圧縮法文字列が '-' で始まっていないか、
'-' で終わっていない場合。public void setOriginalSize(long size)
size - 圧縮前データサイズ
java.lang.IllegalArgumentException - size に LhaHeader.UNKNOWN( -1 )を設定しようとした場合UNKNOWNpublic void setCompressedSize(long size)
size - 圧縮後データサイズ
java.lang.IllegalArgumentException - size に LhaHeader.UNKNOWN を設定しようとしたUNKNOWNpublic void setLastModified(java.util.Date date)
date - 最終更新日時
java.lang.IllegalArgumentException - date に null を設定しようとした場合public void setHeaderLevel(int level)
level - ヘッダレベルpublic void setPath(java.lang.String path)
path - データの名前、もしくはファイル名
java.lang.IllegalArgumentException - path が空文字列である場合File.separatorpublic void setCRC(int crc)
crc - データの圧縮前のCRC16値
java.lang.IllegalArgumentException - crc に LhaHeader.UNKNOWN を設定しようとしたUNKNOWN,
NO_CRCpublic void setOSID(byte id)
id - OS識別子protected void setExtraData(byte[] data)
data - 拡張情報
拡張情報を出力しない場合は nullを設定する。protected void setLevel0DosAttribute(byte attribute)
attribute - MS-DOSのファイル属性
protected void importExtendHeader(byte[] HeaderData,
int index,
int length,
java.lang.String encode)
throws java.io.UnsupportedEncodingException
HeaderData - ヘッダデータindex - HeaderData内の拡張ヘッダの開始位置length - 拡張ヘッダの長さencode - 文字列情報を解釈する際に使用する
エンコード
java.io.UnsupportedEncodingException - encode で指定されたエンコードが
サポートされない場合
protected byte[][] exportExtendHeaders(java.lang.String encode)
throws java.io.UnsupportedEncodingException
encode - 文字列情報を出力する際に使用する
エンコード
java.io.UnsupportedEncodingException - encode で指定されたエンコードが
サポートされない場合public static boolean checkHeaderData(byte[] HeaderData)
HeaderData - ヘッダデータをバイト配列に格納したもの
public static byte[] getFirstHeaderData(java.io.InputStream in)
throws java.io.IOException
in - ヘッダデータを読み込む入力ストリーム
ストリームは mark/resetのサポートを必要とする。
java.io.IOException - 入出力エラーが発生した場合
java.lang.IllegalArgumentException - in が mark/resetをサポートしない場合
public static byte[] getNextHeaderData(java.io.InputStream in)
throws java.io.IOException
in - ヘッダデータを読み込む入力ストリーム
ストリームは mark/resetのサポートを必要とする。
java.io.IOException - 入出力エラーが発生した場合
java.lang.IllegalArgumentException - in が mark/resetをサポートしない場合
public static LhaHeader createInstance(byte[] HeaderData,
java.util.Properties property)
HeaderData - ヘッダのデータを持つバイト配列property - LhaProperty.parse() で LhaHeader のインスタンスが生成できるような
生成式を キー"lha.header" の値として持つプロパティ
|
LHA Library for Java | |||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||