0

Javaでzipプログラムを作成したいのですが、zipファイルとフォルダは次のような構造になります-

  • フォルダー-one/
  • folder-one / one.txt
  • フォルダー-one/two.mp3
  • folder-one / three.jpg
  • フォルダー-two/
  • folder-two / four.doc
  • folder-two / five.rtf
  • folder-two / folder-three /
  • folder-two / folder-three / six.txt

私はzip4jオープンソースを使用しました。すべてのファイル(絶対パスを含む)を1つのリストに集めて、それをzipに渡しましたが、ファイルはmy.zipのようにのみ圧縮されます-

  • one.txt
  • two.mp3
  • three.jpg
  • four.doc
  • five.rtf
  • six.txt

以前のローカルの場合と同じ構造をzipおよびunzipで保持するにはどうすればよいですか。他のオープンソースが、他のWindowszipプログラムと同じ構造のファイルやフォルダでzip/unzipするのに役立つかどうかを提案してください。

コードは以下です-

public class CreateZipWithOutputStreams {

    ArrayList filesToAdd = new ArrayList();

    public void CreateZipWithOutputStreams(String sAbsolutePath) {


        ZipOutputStream outputStream = null;
        InputStream inputStream = null;

        try {

            ArrayList arrLocal = exploredFolder(sAbsolutePath);


            outputStream = new ZipOutputStream(new FileOutputStream(new File("c:\\ZipTest\\CreateZipFileWithOutputStreams.zip")));

            ZipParameters parameters = new ZipParameters();

            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);


            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);

            parameters.setEncryptFiles(true);

            parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);


            parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);


            parameters.setPassword("neelam");


            for (int i = 0; i < arrLocal.size(); i++) {
                File file = (File) arrLocal.get(i);


                outputStream.putNextEntry(file, parameters);

                if (file.isDirectory()) {
                    outputStream.closeEntry();
                    continue;
                }


                inputStream = new FileInputStream(file);
                byte[] readBuff = new byte[4096];
                int readLen = -1;

                while ((readLen = inputStream.read(readBuff)) != -1) {
                    outputStream.write(readBuff, 0, readLen);
                }

                outputStream.closeEntry();

                inputStream.close();
            }

             outputStream.finish();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public ArrayList exploredFolder(String sAbsolutePath) {
        File[] sfiles;
        File fsSelectedPath = new File(sAbsolutePath);
        sfiles = fsSelectedPath.listFiles();
        if (sfiles == null) {
            return null;
        }
        for (int j = 0; j < sfiles.length; j++) {
            File f = sfiles[j];
            if (f.isDirectory() == true) {
                exploredFolder(f.getAbsolutePath());
            } else {
                filesToAdd.add(f);

            }
        }
        return filesToAdd;
    }


    public static void main(String[] args) {
        new CreateZipWithOutputStreams().CreateZipWithOutputStreams("c:\\ZipTest");
    }
}

ありがとう!

4

1 に答える 1

1

さて、最初に添付されたコードは、exploredFolder(String absolutePath)メソッドが「追加するファイル」を返し、それがCreateZipWithOutputStreams()メソッドによって使用されて単一のレイヤード(フラット)zipファイルを作成するため、そのままの状態で機能するはずです。

実行する必要があるのは、個々のフォルダーをループして、それらをに追加し続けることZipOutputStreamです。

以下のリンクをたどると、コードスニペットと詳細な説明が見つかります。

それが役に立ったら教えてください!

http://www.java-forums.org/blogs/java-io/973-how-work-zip-files-java.html

于 2012-09-24T11:54:08.930 に答える