在Java中压缩时如何维护文件夹结构?
发布时间:2020-12-15 02:35:09 所属栏目:Java 来源:网络整理
导读:我想压缩一个像这样结构的文件夹: 温度/文件夹1 / file1的 温度/文件夹2 / file2的 温度/文件3 并完全保持目录结构. 目前,当我拉链时,我得到一个不保持目录结构的zip.看起来像这样 文件1 文件2 文件3 如何将文件添加到各自的文件夹中,就像所有普通的压缩应
我想压缩一个像这样结构的文件夹:
温度/文件夹1 / file1的 温度/文件夹2 / file2的 温度/文件3 并完全保持目录结构. 如何将文件添加到各自的文件夹中,就像所有普通的压缩应用程序一样? 这是我到目前为止的代码: package com.damastah.deflash; import android.util.Log; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class Compress { private static final int BUFFER = 2048; private ArrayList<File> _files; private String _zipFile; public Compress(ArrayList<File> files,String zipFile) { _files = files; _zipFile = zipFile; } public void zip() { try { BufferedInputStream origin = null; FileOutputStream dest = new FileOutputStream(_zipFile); ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream( dest)); byte data[] = new byte[BUFFER]; Log.e("Compress - zip","test"); for (int i = 0; i < _files.size(); i++) { Log.v("Compress","Adding: " + _files.get(i).getAbsolutePath()); FileInputStream fi = new FileInputStream(_files.get(i) .getAbsolutePath()); origin = new BufferedInputStream(fi,BUFFER); ZipEntry entry; if (_files.get(i).getAbsolutePath().contains(".")) entry = new ZipEntry(_files .get(i) .getAbsolutePath() .substring( _files.get(i).getAbsolutePath() .lastIndexOf("/") + 1)); else entry = new ZipEntry(_files.get(i).getAbsolutePath()); out.putNextEntry(entry); int count; while ((count = origin.read(data,BUFFER)) != -1) { out.write(data,count); } origin.close(); } out.close(); } catch (Exception e) { e.printStackTrace(); } } } 解决方法
我不是android开发人员所以请将此代码视为仅提示
class ZipCompress { public static void main(String[] args) throws IOException { String dir = "d:My folder"; // this entries I want to put in archives in the way they are now String[] entries = { "tempfolder1file1.txt","tempfolder2file2.txt","tempfile3.txt" }; ZipOutputStream zipos = new ZipOutputStream(new BufferedOutputStream( new FileOutputStream(dir + "archive.zip"))); // time to create entries and fill them with data for (String entrie : entries) { System.out.println("Writing file: " + dir + entrie); // prepering file stream BufferedInputStream fileStream = new BufferedInputStream( new FileInputStream(dir + entrie)); //-------------------------------------------------------------------------- // Here we decide how we entry will look like in archive. // We use only part of path from String[] entries // like "tempfolder1file1.txt" //-------------------------------------------------------------------------- ZipEntry newEntry = new ZipEntry(entrie); newEntry.setComment("comment to entry: " + newEntry); // now lets put this entry in archive zipos.putNextEntry(newEntry); // lets put data from file to current archive entry int c; while ((c = fileStream.read()) != -1) zipos.write(c); fileStream.close(); } zipos.close(); } } 编辑 我不知道你想在这做什么 if (_files.get(i).getAbsolutePath().contains(".")) entry = new ZipEntry(_files .get(i) .getAbsolutePath() .substring( _files.get(i).getAbsolutePath() .lastIndexOf("/") + 1)); 从我看到它删除文件的路径只留下文件名(类似于_files.get(i).getName()).如果这是真的那么这就是你的zip文件中没有文件夹结构的原因.你说zip条目应该只是那个文件名,没有任何文件夹. 因此,如果您希望zip文件包含路径的某些部分 String dir = "/my/full/path/to/folder/"; for (int i = 0; i < _files.size(); i++) { ... if (_files.get(i).getAbsolutePath().contains(".")) { entry = new ZipEntry(_files .get(i).getAbsolutePath().replace(dir,"")); ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |