お世話になります。
開発環境は以下のとおりです。
開発ツール NetBeans IDE 6.5
JDK 1.6.0_11
OS Windows XP SP2
ant.jar version 1.7.1
はじめ、JDK付属の「java.util.zip.ZipOutputStream」,「java.util.zip.Entry」を用いて、
ZIPファイルを作成していたのですが、
日本語名のファイルを圧縮すると文字化けしてしまい、
調べてみるとJakart Ant内のant.jarの「org.apache.tools.zip.ZipOutputStream」,「org.apache.tools.zip.Entry」を使って
import宣言を変えてsetEncodingしてしまえば簡単に出来るという情報がありました。
早速やってみたのですが、
1.ZIPファイルは作成される。このときファイルサイズがjava.util.zip.*を使ったときと同じ
2.LhaplusやWinRARといった解凍ツールを使って解凍するとエラーが
発生して中身がない
3.日本語が含まれないファイルを圧縮・解凍しても同じ現象
4.java.util.zip.* を使ったときは正常に圧縮・解凍できる(文字化けはしていますが・・・)
といった状況になってしまいました。
ロジックを何度も見直し、ZipOutputStreamのflush、closeもしっかり行っていますし、CRC32の設定やファイルサイズの設定も手順どおりにやっているつもりです。
どなたかご存知のかたがいらっしゃいましたらご教授の程、よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
具体的なコードが無いので何とも言いようが無いのですが、
以下のコードで試してみてください。
私の環境では、問題なく動作しているクラスです。
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipException;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
/**
*
* 複数のファイル及び、サブディレクトリを含めたディレクトリを
* zip圧縮・解凍する為のクラスです。
*
* @author HarukaV49
*
*/
public class FileZip {
private static final int EOF = -1;
private static final int ZIP_BUFF_SIZE = 1024;
/**
* デフォルト(ファイル名解析)エンコーダを使用してファイル及びディレクトリをZIP圧縮します。
* @param zipFilename 作成されるZIPファイル名
* @param targetFiles 圧縮対象のファイル及びディレクトリ名列
* @return 作成されたZIPファイル
* @throws ZipException ZIP例外
* @throws FileNotFoundException ファイル例外
* @throws IOException IO例外
*/
public static File zip(String zipFilename, String... targetFiles) throws ZipException, FileNotFoundException, IOException {
return zip(zipFilename, targetFiles, null);
}
/**
* ファイル及びディレクトリをZIP圧縮します。
* @param zipFilename 作成されるZIPファイル名
* @param targetFiles targetFiles 圧縮対象のファイル及びディレクトリ名配列
* @param encoding ファイル名解析エンコーダ名(<A HREF="http://java.sun.com/javase/6/docs/technotes/guid …一覧</A>)
* @return 作成されたZIPファイル
* @throws ZipException ZIP例外
* @throws FileNotFoundException ファイル例外
* @throws IOException IO例外
*/
public static File zip(String zipFilename, String[] targetFiles, String encoding) throws ZipException, FileNotFoundException, IOException {
int n = targetFiles.length;
File[] files = new File[n];
for(int i=0; i<n; i++) {
files[i] = new File( targetFiles[i] );
}
return zip( new File(zipFilename), files, encoding);
}
/**
* ファイル及びディレクトリをZIP圧縮します。
* @param zipFile 作成されるZIPファイル
* @param targetFiles targetFiles 圧縮対象のファイル及びディレクトリ配列
* @param encoding ファイル名解析エンコーダ名(<A HREF="http://java.sun.com/javase/6/docs/technotes/guid …一覧</A>)
* @return 作成されたZIPファイル
* @throws ZipException ZIP例外
* @throws FileNotFoundException ファイル例外
* @throws IOException IO例外
*/
public static File zip(File zipFile, File[] targetFiles, String encoding) throws ZipException, FileNotFoundException, IOException {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile));
out.setEncoding(encoding);
for(int i=0; i<targetFiles.length; i++) {
int deleteLength = targetFiles[i].getPath().length() - targetFiles[i].getName().length();
zip(out, targetFiles[i], deleteLength);
}
out.close();
return zipFile;
}
private static void zip(ZipOutputStream out, File targetFile, int deleteLength) throws IOException {
if( targetFile.isDirectory() ) {
File[] files = targetFile.listFiles();
for(int i=0; i<files.length; i++) {
zip(out, files[i], deleteLength);
}
} else {
ZipEntry target = new ZipEntry( targetFile.getPath().substring(deleteLength) );
out.putNextEntry(target);
byte buf[] = new byte[ZIP_BUFF_SIZE];
int count;
BufferedInputStream in = new BufferedInputStream( new FileInputStream(targetFile) );
while( (count = in.read(buf, 0, ZIP_BUFF_SIZE)) != EOF ) {
out.write(buf, 0, count);
}
in.close();
out.closeEntry();
}
}
/**
* デフォルト(ファイル名解析)エンコーダを使用してZIPファイルを解凍します。
* @param filename ZIPファイル名
* @param outDir 解凍先ディレクトリ名
* @return 解凍されたファイルまたはディレクトリ
* @throws ZipException ZIP例外
* @throws FileNotFoundException ファイル例外
* @throws IOException IO例外
*/
public static File unzip(String filename, String outDir) throws ZipException, FileNotFoundException, IOException {
return unzip(filename, outDir, null);
}
/**
* ZIPファイルを解凍します。
* @param filename ZIPファイル名
* @param outDir 解凍先ディレクトリ名
* @param encoding ファイル名解析エンコーダ名(<A HREF="http://java.sun.com/javase/6/docs/technotes/guid …一覧</A>)
* @return 解凍されたファイルまたはディレクトリ
* @throws ZipException ZIP例外
* @throws FileNotFoundException ファイル例外
* @throws IOException IO例外
*/
public static File unzip(String filename, String outDir, String encoding) throws ZipException, FileNotFoundException, IOException {
return unzip( new File(filename), new File(outDir), encoding );
}
/**
* ZIPファイルを解凍します。
* @param filename ZIPファイル
* @param outDir 解凍先ディレクトリ
* @param encoding ファイル名解析エンコーダ名(<A HREF="http://java.sun.com/javase/6/docs/technotes/guid …一覧</A>)
* @return 解凍されたファイルまたはディレクトリ
* @throws ZipException ZIP例外
* @throws FileNotFoundException ファイル例外
* @throws IOException IO例外
*/
public static File unzip(File filename, File outDir, String encoding) throws ZipException, FileNotFoundException, IOException {
ZipFile zipFile = new ZipFile(filename, encoding);
@SuppressWarnings("unchecked")
Enumeration<ZipEntry> enumeration = zipFile.getEntries();
while( enumeration.hasMoreElements() ) {
ZipEntry entry = enumeration.nextElement();
if( entry.isDirectory() ) {
new File(entry.getName()).mkdirs();
} else {
File file = new File(outDir, entry.getName());
file.getParentFile().mkdirs();
FileOutputStream out = new FileOutputStream(file);
InputStream in = zipFile.getInputStream(entry);
byte[] buf = new byte[ZIP_BUFF_SIZE];
int size = 0;
while( (size = in.read(buf)) != EOF ) {
out.write(buf, 0, size);
}
out.close();
in.close();
}
}
zipFile.close();
return outDir;
}
}
ありがとうございます!
HarukaV49さんのソースと私のソースの違いは
私が処理を書き過ぎだったのかもしれません。
随分簡単にお書きになるなと思ったのですが、
同じようにしてみたら出来ました!
ありがとうございます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(セキュリティ) PDFファイルのパスワード設定について 1 2022/06/25 10:10
- iPhone(アイフォーン) iPhone ファイル iPhoneのファイルで写真をzipに圧縮した後もう一度展開すると画質は変わ 3 2022/10/21 21:53
- その他(コンピューター・テクノロジー) 圧縮ファイル 解凍すると中身が消える? 3 2022/05/18 15:21
- Windows 8 メール送信、zipファイル PDFについて 回答お願いいたします。 Windows8 メールはサクラ 1 2022/05/12 17:49
- Windows 10 Windows ZIPファイルを解凍してフォルダ内のテキスト文書を編集して上書き保存したいのにCtr 4 2023/06/21 13:14
- Mac OS MacBookでターミナルを利用して、 zipファイルにパスワードを付けて、 正しいパスワードを入力 2 2022/06/08 23:41
- Android tar.ファイルのインストールについて知りたいです 2 2022/07/23 15:34
- ノートパソコン パソコンでmp4の動画ファイルを10個くらい(合計20GB)をフォルダに入れて、容量を軽くしてしまお 2 2023/02/06 02:08
- Android(アンドロイド) androidでzip圧縮してから転送できるファイラー 3 2022/12/11 10:22
- WordPress(ワードプレス) [BuddyPress]試したいのですが! 3 2022/06/01 13:36
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SVFの設定について:クラスパス...
-
javaクラスファイルをEclipseで...
-
「削除するか、クラスパスの正...
-
classファイルについて
-
Eclipse・プロジェクトで、フォ...
-
java クラスファイルとソースコ...
-
import javax.el.*;について
-
コンパイルした後 java (class...
-
org.apache.tools.zip.* を使っ...
-
jdbcドライバのjarファイルにク...
-
EclipseでHTTP404エラーが出る。
-
eclipseでjarファイル内のリソ...
-
EclipseでのJSP・Servlet開発に...
-
classファイルが作成されない
-
VisualStudioでC++クラスを追加...
-
【Eclipse】パッケージ・エクス...
-
ResourceBundleクラスの使い方
-
JavaBeansファイルとサーブレッ...
-
earファイルを展開する方法
-
コンパイルをしようとするとエ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Eclipse・プロジェクトで、フォ...
-
classファイルについて
-
javaクラスファイルをEclipseで...
-
Eclipse「リフレッシュ」と「ク...
-
SVFの設定について:クラスパス...
-
eclipse でclassesフォルダーが...
-
【Eclipse】パッケージ・エクス...
-
earファイルを展開する方法
-
EclipseでHTTP404エラーが出る。
-
jdbcドライバのjarファイルにク...
-
プログラム実行の際に、「ソー...
-
「メイン・マニフェスト属性が...
-
「削除するか、クラスパスの正...
-
コンパイルをしようとするとエ...
-
java クラスファイルとソースコ...
-
『ClassNotFoundException: org...
-
javax.mailがimportできない
-
ResourceBundleクラスの使い方
-
macでのファイル場所指定
-
「main メソッドを持つクラスが...
おすすめ情報