LHA Library for Java

jp.gr.java_conf.dangan.util.lha
Class LhaHeader

java.lang.Object
  extended by jp.gr.java_conf.dangan.util.lha.LhaHeader
All Implemented Interfaces:
java.lang.Cloneable

public class LhaHeader
extends java.lang.Object
implements java.lang.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(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

UNKNOWN

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

See Also:
Constant Field Values

NO_CRC

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

See Also:
Constant Field Values
Constructor Detail

LhaHeader

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

Parameters:
path - パス名
Throws:
IllgelArgumentException - path が null か 空文字列のいずれかである場合

LhaHeader

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

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

LhaHeader

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

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

LhaHeader

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

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

clone

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

Overrides:
clone in class java.lang.Object
Returns:
このオブジェクトのコピー

getCompressMethod

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

Returns:
圧縮法文字列

getOriginalSize

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

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

getCompressedSize

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

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

getLastModified

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

Returns:
データの最終更新日時

getHeaderLevel

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

Returns:
ヘッダレベル

getPath

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

Returns:
データの名前、もしくは パス名。
See Also:
File.separator

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 )を返す
See Also:
UNKNOWN, NO_CRC

getOSID

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

Returns:
OSの識別子

getExtraData

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

Returns:
拡張データ

getLevel0DosAttribute

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

Returns:
DOS の ファイル属性

getBytes

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

Returns:
バイト配列に格納したヘッダデータ
Throws:
java.lang.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(java.lang.String encode)
                throws java.io.UnsupportedEncodingException
このLhaHeaderのデータを使用して ヘッダデータを生成し、 それをバイト配列の形で得る。

Parameters:
encode - 文字列情報を出力する際に使用する エンコード
Returns:
バイト配列に格納したヘッダデータ
Throws:
java.lang.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 以外である場合
の何れか。
java.io.UnsupportedEncodingException - encode で指定されたエンコードが サポートされない場合

setCompressMethod

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

Parameters:
method - 圧縮法文字列
Throws:
java.lang.IllegalArgumentException - 圧縮法文字列が '-' で始まっていないか、 '-' で終わっていない場合。

setOriginalSize

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

Parameters:
size - 圧縮前データサイズ
Throws:
java.lang.IllegalArgumentException - size に LhaHeader.UNKNOWN( -1 )を設定しようとした場合
See Also:
UNKNOWN

setCompressedSize

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

Parameters:
size - 圧縮後データサイズ
Throws:
java.lang.IllegalArgumentException - size に LhaHeader.UNKNOWN を設定しようとした
See Also:
UNKNOWN

setLastModified

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

Parameters:
date - 最終更新日時
Throws:
java.lang.IllegalArgumentException - date に null を設定しようとした場合

setHeaderLevel

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

Parameters:
level - ヘッダレベル

setPath

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

Parameters:
path - データの名前、もしくはファイル名
Throws:
java.lang.IllegalArgumentException - path が空文字列である場合
See Also:
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バイトは無視される。

Parameters:
crc - データの圧縮前のCRC16値
Throws:
java.lang.IllegalArgumentException - crc に LhaHeader.UNKNOWN を設定しようとした
See Also:
UNKNOWN, NO_CRC

setOSID

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

Parameters:
id - OS識別子

setExtraData

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

Parameters:
data - 拡張情報 拡張情報を出力しない場合は nullを設定する。

setLevel0DosAttribute

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

Parameters:
attribute - MS-DOSのファイル属性

importExtendHeader

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

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

exportExtendHeaders

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

Parameters:
encode - 文字列情報を出力する際に使用する エンコード
Returns:
1つの拡張ヘッダを1つのバイト配列に格納し、 それを配列の形にしたもの
Throws:
java.io.UnsupportedEncodingException - encode で指定されたエンコードが サポートされない場合

checkHeaderData

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

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

getFirstHeaderData

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

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

getNextHeaderData

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

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

createInstance

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

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

LHA Library for Java

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.