5

次の方法を使用して、ファイルをzipファイルに圧縮しています。

import java.util.zip.CRC32;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public static void doZip(final File inputfis, final File outputfis) throws IOException {

    FileInputStream fis = null;
    FileOutputStream fos = null;

    final CRC32 crc = new CRC32();
    crc.reset();

    try {
        fis = new FileInputStream(inputfis);
        fos = new FileOutputStream(outputfis);
        final ZipOutputStream zos = new ZipOutputStream(fos);
        zos.setLevel(6);
        final ZipEntry ze = new ZipEntry(inputfis.getName());
        zos.putNextEntry(ze);
        final int BUFSIZ = 8192;
        final byte inbuf[] = new byte[BUFSIZ];
        int n;
        while ((n = fis.read(inbuf)) != -1) {
            zos.write(inbuf, 0, n);
            crc.update(inbuf);
        }
        ze.setCrc(crc.getValue());
        zos.finish();
        zos.close();
    } catch (final IOException e) {
        throw e;
    } finally {
        if (fis != null) {
            fis.close();
        }
        if (fos != null) {
            fos.close();
        }
    }
}

私の問題は、N°TICKETたとえば、コンテンツを含むフラットなテキストファイルがあることです。圧縮されていない場合、zip形式の結果に奇妙な文字が表示されN° TICKETます。また、やなどの文字はサポートされéàいません。

ISO-8859-1文字エンコードが原因だと思いますが、zipメソッドで?に設定する方法がわかりません。

(私はWindows 7、Java 6で実行しています)

4

3 に答える 3

6

与えられたバイトを正確に書き込むストリームを使用しています。ライターは文字データを解釈して対応するバイトに変換し、リーダーはその逆を行います。Java(少なくともバージョン6では)は、zipデータの操作と文字の書き込みを組み合わせる簡単な方法を提供していません。

ただし、この方法は機能します。ただし、少し不格好です。

File inputFile = new File("utf-8-data.txt");
File outputFile = new File("latin-1-data.zip");

ZipEntry entry = new ZipEntry("latin-1-data.txt");

BufferedReader reader = new BufferedReader(new FileReader(inputFile));

ZipOutputStream zipStream = new ZipOutputStream(new FileOutputStream(outputFile));
BufferedWriter writer = new BufferedWriter(
    new OutputStreamWriter(zipStream, Charset.forName("ISO-8859-1"))
);

zipStream.putNextEntry(entry);

// this is the important part:
// all character data is written via the writer and not the zip output stream
String line = null;
while ((line = reader.readLine()) != null) {
    writer.append(line).append('\n');
}
writer.flush(); // i've used a buffered writer, so make sure to flush to the
// underlying zip output stream

zipStream.closeEntry();
zipStream.finish();

reader.close(); 
writer.close();
于 2012-10-08T18:35:22.567 に答える
4

AfaikこれはJava6では使用できません。

しかし、私はhttp://commons.apache.org/compress/が解決策を提供できると信じています。

Java 7に切り替えると、そのエンコードが追加パラメーターとして使用される新しいコンストラクターが提供されます。

https://blogs.oracle.com/xuemingshen/entry/non_utf_8_encoding_in

zipStream = new ZipInputStream(
    new BufferedInputStream(new FileInputStream(archiveFile), BUFFER_SIZE),
    Charset.forName("ISO-8859-1")
于 2012-10-08T17:33:52.150 に答える
0

org.apache.commons.compress.archivers.zip.ZipFileを使用してみてください。Java独自のライブラリではないので、次のようなエンコーディングを与えることができます。

import org.apache.commons.compress.archivers.zip.ZipFile;

ZipFile zipFile = new ZipFile(filepath、encoding);

于 2014-06-17T07:25:24.360 に答える