4

test.zip などのファイルがあります。winrar のような ZIP ツールを使用すると、簡単に抽出できます (test.zip を test.csv に解凍します)。ただし、test.csv は UTF8 形式ではありません。ここでの問題は、Java を使用して解凍すると、このファイルを読み取れないことです。

ZipFile zf = new ZipFile("C:/test.zip");

スローされた例外は、そのファイルを開くことによってエラーが発生したことを示しています。

Java http://java.sun.com/developer/technicalArticles/Programming/compression/では、データのフォーマットについては何も書かれていません。API全体がUTF8形式のデータ専用に設計されているのかもしれません。では、UTF8 以外の形式のデータを解凍する必要がある場合、どのように解凍すればよいのでしょうか? 特に、より多くのスペースサイズを保持する日本語と漢字 (UTF8 を除く)。また、この問題が言及されているhttp://truezip.java.net/6/tutorial.htmlでAPI を見つけました 。しかし、それを解決する方法がわかりませんでした。この問題を解決する簡単な方法はありますか? 特にJAVA仕様リクエストから渡されるAPIから。

4

5 に答える 5

4

JDK6 には、java.util.zip 実装にバグがあり、USASCII 以外の文字を処理できません。Apache Commons commons-compress-1.0.jar ライブラリを使用して修正します。JDK7 では、java.util.zip の実装が修正されました。 http://docs.oracle.com/javase/7/docs/api/java/util/zip/ZipInputStream.html

import java.io.*;
import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.zip.*;

public static int unzip(File inputZip, File outputFolder) throws IOException {
    int count=0;
    FileInputStream fis = null;
    ZipArchiveInputStream zis = null;
    FileOutputStream fos = null;
    try {
        byte[] buffer = new byte[8192];
        fis = new FileInputStream(inputZip);
        zis = new ZipArchiveInputStream(fis, "Cp1252", true); // this supports non-USACII names
        ArchiveEntry entry;
        while ((entry = zis.getNextEntry()) != null) {
            File file = new File(outputFolder, entry.getName());
            if (entry.isDirectory()) {
                file.mkdirs();
            } else {
                count++;
                file.getParentFile().mkdirs();
                fos = new FileOutputStream(file);
                int read;
                while ((read = zis.read(buffer,0,buffer.length)) != -1)
                    fos.write(buffer,0,read);
                fos.close();
                fos=null;
            }
        }
    } finally {
        try { zis.close(); } catch (Exception e) { }
        try { fis.close(); } catch (Exception e) { }
        try { if (fos!=null) fos.close(); } catch (Exception e) { }
    }
    return count;
}
于 2013-12-11T15:39:38.480 に答える
3

いいえ、zip ファイルはUTF-8 データ専用ではありません。Zip ファイルは、ファイル内のデータをまったく解釈しようとしません。Java API も同様です。

ASCII 以外のファイルには問題があるかもしれませんが、ファイルの内容自体はまったく問題になりません。あなたの場合、ファイルの名前はただのように見えるtest.zipので、名前のエンコードの問題が発生することはありません。

ファイルを開けない場合は、別の問題があるようです。期待する場所にファイルが存在しますか?

于 2012-07-31T06:06:28.553 に答える
1

以下のコードを試すことができますか?その他の例については、http://java2novice.com/java-collections-and-util/zip/unzip/を参照してください。

FileInputStream fis = null;
    ZipInputStream zipIs = null;
    ZipEntry zEntry = null;
    try {
        fis = new FileInputStream(filePath);
        zipIs = new ZipInputStream(new BufferedInputStream(fis));
        while((zEntry = zipIs.getNextEntry()) != null){
            try{
                byte[] tmp = new byte[4*1024];
                FileOutputStream fos = null;
                String opFilePath = "C:/"+zEntry.getName();
                System.out.println("Extracting file to "+opFilePath);
                fos = new FileOutputStream(opFilePath);
                int size = 0;
                while((size = zipIs.read(tmp)) != -1){
                    fos.write(tmp, 0 , size);
                }
                fos.flush();
                fos.close();
            } catch(Exception ex){

            }
        }
        zipIs.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
于 2012-07-31T11:14:42.053 に答える
0

すべてのzipファイルを抽出するために使用したこのコードを試してください

try
    {

        final ZipFile zf = new ZipFile("C:/Documents and Settings/satheesh/Desktop/POTL.Zip");

        final Enumeration<? extends ZipEntry> entries = zf.entries();
        ZipInputStream zipInput = null;

        while (entries.hasMoreElements())
        {
            final ZipEntry zipEntry=entries.nextElement();
            final String fileName = zipEntry.getName();
        // zipInput = new ZipInputStream(new FileInputStream(fileName));
            InputStream inputs=zf.getInputStream(zipEntry);
            //  final RandomAccessFile br = new RandomAccessFile(fileName, "r");
                BufferedReader br = new BufferedReader(new InputStreamReader(inputs, "UTF-8"));
                FileWriter fr=new FileWriter(f2);
            BufferedWriter wr=new BufferedWriter(new FileWriter(f2) );

            while((line = br.readLine()) != null)
            {
                wr.write(line);
                System.out.println(line);
                wr.newLine();
                wr.flush();
            }
            br.close();
            zipInput.closeEntry();
        }


    }
    catch(Exception e)
    {
        System.out.print(e);
    }
    finally
    {
        System.out.println("\n\n\nThe had been extracted successfully");

    }

このコードは本当にうまく機能します。

于 2013-02-11T19:13:49.543 に答える
0

私が覚えているように、これはファイル名が UTF8 でエンコードされていない場合にのみ発生します。

3rd Component が禁止されていない場合は、Apache Zip API を試してください。

org.apache.tools.zip.ZipEntry をインポートします。org.apache.tools.zip.ZipFile をインポートします。

于 2012-07-31T06:29:23.363 に答える