0

zip入力または出力ストリームでzipファイルを開くことに関する回答は探していません。私の質問は、Javaでjarファイルを他のファイルと同じように(バッファリングされたリーダー/ライターを使用して)単に開き、その内容を読み取り、別の場所に書き込むことは可能ですか? 例えば:

import java.io.*;

public class zipReader {

public static void main(String[] args){

    BufferedReader br = new BufferedReader(new FileReader((System.getProperty("user.home").replaceAll("\\\\", "/") + "/Desktop/foo.zip")));
    BufferedWriter bw = new BufferedWriter(new FileWriter((System.getProperty("user.home").replaceAll("\\\\", "/") + "/Desktop/baf.zip")));
    char[] ch = new char[180000];

    while(br.read(ch) > 0){

        bw.write(ch);
        bw.flush();

    }

    br.close();
    bw.close();

}

}

これは一部の小さな zip/jar ファイルで機能しますが、ほとんどの場合、ファイルが破損して解凍または実行できなくなります。char[] のサイズを 1 に設定しても、ファイルは破損せず、その中のすべてが破損することがわかりました。つまり、アーカイブ プログラムでファイルを開くことはできますが、そのすべてのエントリが破損して使用できなくなります。ファイルが破損しないように上記のコードを記述する方法を知っている人はいますか? また、これをテストしたjarファイルの行が破損しました。

nèñà?G¾Þ§ V¨ö—‚?‰9³'?ÀM·p›a0„èwåÕüaEܵp‡aæOùR‰(JºJ´êgžè*?”6ftöãÝÈ—ê@qïc3âi,áž…¹¿Êð)V¢cã>Ê”G˜ (†®9öCçM?€ÔÙÆC†ÑÝ×ok?ý—¥úûFs.‡</p>

対オリジナル:

nèñàG¾Þ§ V¨ö—‚‰9³'ÀM·p›a0„èwåÕüaEܵp‡aæOùR‰(JºJ´êgžè*?”6ftöãÝÈ—ê@qïc3âi,áž…¹¿Êð)V¢cã>Ê”G˜(†®9öCçM €ÔÙÆC†ÑÝ×oký—\úûFs.‡</p>

ご覧のとおり、リーダーまたはライターのいずれかが ? をファイルに追加しますが、その理由がわかりません。繰り返しますが、エントリごとに開くようにという回答は望んでいません。その方法はすでに知っています。誰かが私の質問に対する回答を知っている場合は、それを共有してください。

4

3 に答える 3

1

bw.write(ch)配列全体を書き込みます。Read はその一部のみを入力し、その量を示す数値を返します。これは zip ファイルとは関係ありません。IO の仕組みだけです。

コードを次のように変更する必要があります。

 int charsRead = br.read(buffer);
 if (charsRead >= 0) {
       bw.write(buffer, 0, charsRead);
 } else {
       // whatever I do at the end.
 }

ただし、これは問題の 1/2 にすぎません。また、バイトを文字に変換したり、逆に変換したりすると、他の方法でデータが破損します。ストリームに固執します。

于 2013-09-28T15:13:07.580 に答える
0

ZipInputStreamおよびZipOutputStreamクラスを参照してください

編集:プレーンな FileInputStream と FileOutputStream を使用します。リーダーがバイトを文字として解釈しているときに、いくつかの問題があるのではないかと思います。

参照: Java でファイルをコピーする標準的な簡潔な方法? ファイル全体をコピーするのはアリなので、zip ファイルであることは特別なことではありません。

于 2013-09-28T15:17:18.453 に答える