public class LhaHeader
extends java.lang.Object
implements java.lang.Cloneable
-- 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] ソース整備 タブ廃止 ライセンス文の修正
Modifier and Type | Field and Description |
---|---|
static int |
NO_CRC
CRC値が無い事を意味する値。
レベル0ヘッダでCRC値が存在しない事を意味する。
|
static int |
UNKNOWN
不明を意味する値。
LhaHeader.getCRC(), LhaHeader.getCompressedSize(),
LhaHeader.getOriginalSzie() がこの値を返した場合は
処理前のために、その値が不明である事を示す。
|
Constructor and Description |
---|
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 が パスデリミタでターミネートされている場合は ディレクトリであると解釈される。 |
Modifier and Type | Method and Description |
---|---|
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()時に例外を投げる |
public static final int UNKNOWN
public static final int NO_CRC
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 の場合public java.lang.Object clone()
clone
in class java.lang.Object
public java.lang.String getCompressMethod()
public long getOriginalSize()
UNKNOWN
public long getCompressedSize()
UNKNOWN
public java.util.Date getLastModified()
public int getHeaderLevel()
public java.lang.String getPath()
File.separator
public int getCRC()
public 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 )を設定しようとした場合UNKNOWN
public void setCompressedSize(long size)
size
- 圧縮後データサイズjava.lang.IllegalArgumentException
- size に LhaHeader.UNKNOWN を設定しようとしたUNKNOWN
public 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.separator
public void setCRC(int crc)
public 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" の値として持つプロパティ
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.