dポイントプレゼントキャンペーン実施中!

こんにちわ。

Javaの解凍処理について質問です。

Test.zipがあって、その中身が「テスト.xls」とした時、うまく解凍ができません。
Zipファイルの中身が日本語名ではなく、「Test.xls」であれば正常に解凍ができます。

下記の書き方では日本語名のファイルの入ったZipファイルを解凍することはできないのでしょうか?
どなたかご教授お願い致します。


String fname = null;
FileInputStream fis = null;
BufferedInputStream bis = null;
ZipInputStream zis = null;
ZipEntry zent = null;

FileOutputStream fos = null;

try
{
fis = new FileInputStream(FilePath);
bis = new BufferedInputStream(fis);
zis = new ZipInputStream(bis);

byte[] buf = new byte[1024];
int len;

// アーカイブ中に含まれるファイル情報の取得

while ((zent = zis.getNextEntry()) != null) {

int intResult = zent.toString().indexOf(".");
int intLength = zent.toString().length();

//ファイル名の変更(フォルダ名+社員コード)StringBuffer BuffRename = new StringBuffer();
BuffRename.append("D:\\test\\");
BuffRename.append(zent.getName().substring(0,intResult));
BuffRename.append(SyainCd);
BuffRename.append(zent.getName().substring(intResult,intLength));
fname = BuffRename.toString();

//書き込みファイルをオープン
fos = new FileOutputStream(fname);
while (-1 != (len = zis.read(buf, 0, buf.length))) {
fos.write(buf, 0, len);
}
//★★★
fos.close();
}
Catch・finallyは省略

A 回答 (2件)

#1の方が書いておられる通り,java.util.ZipInputStreamはUTF-8にしか対応していないようです。



#試しにjarで,
#日本語(SJIS)エントリーをもつzipファイルを開いてみたところ,
#ZipInputStream.getNextEntry()から呼び出されている
#ZipIputStream.getUTF8String()というメソッドで
#IllegalArugumentExceptionが発生しました。

illusion_catさんがどういう目的でzipの解凍処理をjavaで書こうとしているのかがわからないので,役に立たないアドバイスかもしれませんが,解凍対象のzipファイルを自分で作るような状況であれば,作成時に日本語(SJIS等)のエントリー名をUTF-8に変換してzipファイルに格納し,解凍時にそれを元の文字コードに戻すようにする,というのが一つの方法として考えられます。

そうでなくもっと根本的な対処としては,例えば自分でZipInputStreamクラスを継承するクラス(例えばMyZipInputStream)をつくって,そこにZipEntry名の文字コードを指定できるgetNextEntryメソッド(例えばgetNextEntry(String charEncoding))を追加するという方法も考えられます。

MyZipInputStream.getNextEntry(String) の中身の処理は,zipファイルのフォーマットをベースに,Javaのソースを参考にして書いてみてはどうでしょうか?
    • good
    • 0

こんばんわ。



サイト検索して以下の情報を見つけました。

ZipInputStreamはUTF-8固定で日本語名ファイルを解凍不可能です。
org.apache.tools.zip.ZipFile
ZipEntry、Enumeration取得
ZipFileにZipEntryを引数にしてファイルごとの解凍されたInputStreamが取り出せる。

とのことです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!