jp.gr.java_conf.dangan.util.lha

Class LhaHeader

Implemented Interfaces:
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]
     ソース整備
     タブ廃止
     ライセンス文の修正

 
Version:
$Revision: 1.2.2.3 $
Author:
$Author: dangan $

Field Summary

static int
NO_CRC
CRC値が無い事を意味する値。 レベル0ヘッダでCRC値が存在しない事を意味する。
static int
UNKNOWN
不明を意味する値。 LhaHeader.getCRC(), LhaHeader.getCompressedSize(), LhaHeader.getOriginalSzie() がこの値を返した場合は 処理前のために、その値が不明である事を示す。

Constructor Summary

LhaHeader(String path)
path という名前を持つ LhaHeader のインスタンスを生成する。
パスデリミタには File.separator を使用すること。
path が パスデリミタでターミネートされている場合は ディレクトリであると解釈される。
LhaHeader(String path, Date date)
path という名前を持ち、最終更新日時が date の LhaHeader のインスタンスを生成する。
パスデリミタには File.separator を使用すること。
path が パスデリミタでターミネートされている場合は ディレクトリであると解釈される。
LhaHeader(byte[] HeaderData)
ヘッダデータから 新しい LhaHeader の インスタンスを生成する。
エンコードは LhaUtil.DefaultEncode が使用される。
LhaHeader(byte[] HeaderData, String encode)
ヘッダデータから 新しい LhaHeader の インスタンスを生成する。

Method Summary

static boolean
checkHeaderData(byte[] HeaderData)
ヘッダデータが正当であるかをチェックする。
Object
clone()
このオブジェクトのコピーを作成して返す。
static LhaHeader
createInstance(byte[] HeaderData, Properties property)
property の キー"lha.header" に結び付けられた生成式を使用して HeaderData から LhaHeader のインスタンスを生成する。
protected byte[][]
exportExtendHeaders(String encode)
拡張ヘッダをバイト配列の形にして出力する。 このメソッドをオーバーライドする事によって 様々な拡張ヘッダに対応することが可能となる。 LhaHeader では private メンバである ExtraExtHeaders に登録された拡張ヘッダの情報を 返すだけである。 出力の形式は 第一バイト目に拡張ヘッダ識別子 続いて、拡張ヘッダデータが格納され、 次の拡張ヘッダの大きさは添付されない。
byte[]
getBytes()
このLhaHeaderのデータを使用して ヘッダデータを生成し、 それをバイト配列の形で得る。
エンコードはデフォルトのものが使用される。
byte[]
getBytes(String encode)
このLhaHeaderのデータを使用して ヘッダデータを生成し、 それをバイト配列の形で得る。
int
getCRC()
データのCRC16値を得る。
String
getCompressMethod()
データを圧縮した方法を識別する文字列を得る。
long
getCompressedSize()
データの圧縮後のサイズを得る。
protected byte[]
getExtraData()
レベル 0 ヘッダ、 レベル 1 ヘッダの時に 付加される可能性がある基本ヘッダ内の拡張データを得る。
static byte[]
getFirstHeaderData(InputStream in)
入力ストリームから 最初のヘッダを読み込む。
このメソッドはレベル1ヘッダ、もしくは レベル3ヘッダに 似たデータが存在すると、ヘッダ全てを読み込もうとして in.mark( 65536 ) の 限界を超えて 読み込む可能性があり、 その結果 reset() できずに その間のデータを読み落とす 可能性がある。
また、InputStream のmark/reset の実装次第では ストリーム終端付近で ヘッダに似たデータが存在すると ヘッダを全て読み込もうとして EndOfStreamに達してしまい、 reset()できずに その間のデータを読み落とす可能性がある。
int
getHeaderLevel()
このヘッダのヘッダレベルを得る。
Date
getLastModified()
データの最終更新日時を得る。
protected byte
getLevel0DosAttribute()
レベル 0 ヘッダに記される DOS のファイル属性を得る。
static byte[]
getNextHeaderData(InputStream in)
入力ストリームから 次のヘッダを読み込む。
このメソッドはレベル1ヘッダ、もしくは レベル3ヘッダに 似たデータが存在すると、ヘッダ全てを読み込もうとして in.mark( 65536 ) の 限界を超えて 読み込む可能性があり、 その結果 reset() できずに その間のデータを読み落とす 可能性がある。
また、ストリーム終端付近で ヘッダに似たデータが存在する と ヘッダを全て読み込もうとして EndOfStreamに達してしまい、 reset()できずに その間のデータを読み落とす可能性がある。
byte
getOSID()
このヘッダを作成した OS の識別子を得る。
long
getOriginalSize()
データの圧縮前のサイズを得る。
String
getPath()
データの名前、 もしくはデータがファイルであった場合のパス名を得る。
パス名とはいっても、Windows 系の A: のような ドライブ名を含んではならない。
パスデリミタには File.separator を使用する。
protected void
importExtendHeader(byte[] HeaderData, int index, int length, String encode)
拡張ヘッダを読み込む。 このメソッドをオーバーライドする事によって 様々な拡張ヘッダに対応することが可能となる。 LhaHeader では 拡張ヘッダを private メンバである ExtraExtHeaders に登録するだけである。
void
setCRC(int crc)
圧縮前のデータの CRC16値を設定する。
LhaHeader.UNKNOWN( -1 ) は サイズ不明を示す 特別な数字であるため設定できない。
LhaHeader.NO_CRC( -2 ) は レベル0ヘッダの場 合に CRC値を出力しないことを意味する特別な値 である。
他のヘッダレベルの時に LhaHeader.NO_CRC( -2 ) を設定しても例外を投げないが getBytes() 時に 例外を投げるので注意すること。
有効なのは下位2バイトで、上位2バイトは無視される。
void
setCompressMethod(String method)
圧縮法文字列を設定する。
void
setCompressedSize(long size)
圧縮後データサイズを設定する。
LhaHeader.UNKNOWN( -1 ) は サイズ不明を示す 特別な数字であるため設定できない。
また レベル0,1,3 では処理できるのは 4バイト値のみであるため 4バイトで表現できない値を設定した場合 getByte() 時に例外を投げる。
protected void
setExtraData(byte[] data)
レベル 0,1ヘッダ時に使用される 基本ヘッダ内 拡張情報を設定する。
拡張情報のバイト数には§限が存在するが、このメソッドは §限を越えても例外を投げないことに注意。§限を越えた場合 getBytes()時に例外を投げる。
void
setHeaderLevel(int level)
ヘッダレベルを設定する。
現在設定できるのは 0,1,2,3 のみとなっている。
ヘッダレベルの変更はパスの最大長や、LastModified の§限範囲 などを変化させるため注意が必要である。
void
setLastModified(Date date)
圧縮データの最終更新日時を設定する。
ヘッダレベルが 0,1 の場合は MsdosDateで表せる範囲内、 ヘッダレベルが 2,3 の場合は 4byte の time_tで表せる範囲内 の日付で無ければならない。
範囲内でなくても このメソッドは例外を投げないことに注意す ること。範囲内に無い場合は このメソッドは例外を投げないが、 getBytes() 時に例外を投げる。
protected void
setLevel0DosAttribute(byte attribute)
レベル 0ヘッダの場合に出力される、 MS-DOS のファイル属性を設定する。
void
setOSID(byte id)
このヘッダにOS固有の情報が含まれる場合、 そのデータを解釈する手がかりとして OSの識別子を設定する。
void
setOriginalSize(long size)
圧縮前データサイズを設定する。
LhaHeader.UNKNOWN( -1 ) は サイズ不明を示す 特別な数字であるため設定できない。
また レベル0,1,3 では処理できるのは 4バイト値のみであるため 4バイトで表現できない値を設定した場合 getByte() 時に例外を投げる。
void
setPath(String path)
データの名前、もしくはデータがファイルである場合、 データのパスを設定する。
パスデリミタには File.separator を使用する。
ヘッダレベルによって path にはバイト数の§限が存在するが、 このメソッドは§限を越えた場合でも 例外を投げないことに 注意。§限を越えた場合は このメソッドは例外を投げないが、 getBytes()時に例外を投げる

Field Details

NO_CRC

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

UNKNOWN

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

Constructor Details

LhaHeader

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

LhaHeader

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

LhaHeader

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

LhaHeader

public LhaHeader(byte[] HeaderData,
                 String encode)
            throws UnsupportedEncodingException
ヘッダデータから 新しい LhaHeader の インスタンスを生成する。
Parameters:
HeaderData - ヘッダデータ
encode - 文字列情報を解釈する際に使用する エンコード

Method Details

checkHeaderData

public static boolean checkHeaderData(byte[] HeaderData)
ヘッダデータが正当であるかをチェックする。
Parameters:
HeaderData - ヘッダデータをバイト配列に格納したもの
Returns:
ヘッダデータが正当であれば true 違えば false

clone

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

createInstance

public static LhaHeader createInstance(byte[] HeaderData,
                                       Properties property)
property の キー"lha.header" に結び付けられた生成式を使用して HeaderData から LhaHeader のインスタンスを生成する。
Parameters:
HeaderData - ヘッダのデータを持つバイト配列
property - LhaProperty.parse() で LhaHeader のインスタンスが生成できるような 生成式を キー"lha.header" の値として持つプロパティ
Returns:
LhaHeader のインスタンス

exportExtendHeaders

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

getBytes

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

getBytes

public byte[] getBytes(String encode)
            throws UnsupportedEncodingException
このLhaHeaderのデータを使用して ヘッダデータを生成し、 それをバイト配列の形で得る。
Parameters:
encode - 文字列情報を出力する際に使用する エンコード
Returns:
バイト配列に格納したヘッダデータ

getCRC

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

getCompressMethod

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

getCompressedSize

public long getCompressedSize()
データの圧縮後のサイズを得る。
Returns:
圧縮後のサイズ
LhaHeader( String path ) または LhaHeader( String path, Date date )で生成された インスタンスは初期状態ではサイズが不明のため LhaHeader.UNKNOWN( -1 ) を返す。

getExtraData

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

getFirstHeaderData

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

getHeaderLevel

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

getLastModified

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

getLevel0DosAttribute

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

getNextHeaderData

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

getOSID

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

getOriginalSize

public long getOriginalSize()
データの圧縮前のサイズを得る。
Returns:
圧縮前のサイズ
LhaHeader( String path ) または LhaHeader( String path, Date date )で生成された インスタンスは初期状態ではサイズが不明のため LhaHeader.UNKNOWN( -1 ) を返す。

getPath

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

importExtendHeader

protected void importExtendHeader(byte[] HeaderData,
                                  int index,
                                  int length,
                                  String encode)
            throws UnsupportedEncodingException
拡張ヘッダを読み込む。 このメソッドをオーバーライドする事によって 様々な拡張ヘッダに対応することが可能となる。 LhaHeader では 拡張ヘッダを private メンバである ExtraExtHeaders に登録するだけである。
Parameters:
HeaderData - ヘッダデータ
index - HeaderData内の拡張ヘッダの開始位置
length - 拡張ヘッダの長さ
encode - 文字列情報を解釈する際に使用する エンコード

setCRC

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

setCompressMethod

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

setCompressedSize

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

setExtraData

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

setHeaderLevel

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

setLastModified

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

setLevel0DosAttribute

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

setOSID

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

setOriginalSize

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

setPath

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

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.