import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;/** */
/**
 * 打包照片文件
 */
public class YZ { private final static String AddPath = "date";// 压缩文件夹 private final static String AddFile = "info.rar";// 压缩文件 public static List<String> runYz(String zipPath, String zipFile)
throws IOException {
return new YZ().zip(AddPath, AddFile);
} public static void main(String[] args) throws IOException {
// 压缩的目录,//压缩后的文件 runYz(AddPath, AddFile); System.out.println("end");
} // 压缩文件夹 // 压缩文件名
public List<String> zip(String zipPath, String zipFile) throws IOException {
List<String> list = new ArrayList<String>();
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile)); // 压缩包流
zos.setEncoding(CharSet);
zip(new File(zipPath), list, zos);
zos.closeEntry();
zos.close();
return list; } // 压缩
private void zip(File rootPath, List<String> list, ZipOutputStream zos)
throws IOException {
File filesPath[] = rootPath.listFiles();
for (File filePath : filesPath) {
if (filePath.isDirectory())
zip(filePath, list, zos);
else {
String tmpVale = filePath.getPath().replace(
getZipView(AddPath), ReplaceSign)
+ filePath.getName(); list.add(filePath.getPath());// 记录文件
zos.putNextEntry(new ZipEntry(tmpVale));
add(zos, filePath);
}
}
if (new File(SumRun.LogFile).exists()
&& new File(SumRun.LogFile).isFile()) {
zos.putNextEntry(new ZipEntry(SumRun.LogFile));
add(zos, new File(SumRun.LogFile));
} if (new File(SumRun.KeyFile).exists()
&& new File(SumRun.KeyFile).isFile()) {
zos.putNextEntry(new ZipEntry(SumRun.KeyFile));
add(zos, new File(SumRun.KeyFile));
} } // 压缩写文件
private void add(ZipOutputStream zos, File filePath) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
filePath.getPath()));
while (bis.read(BufSum, 0, Buf) != -1)
zos.write(BufSum);
bis.close();
} // ---------------------------------------------------------------------- // 压缩文件的root目录名称
private String getZipView(String viewDir) {
return viewDir.substring(0, viewDir.lastIndexOf(LastSign) + 1);
} private final byte[] BufSum = new byte[10240]; // 缓冲区 private final int Buf = 2048; // 缓冲区 private final static String LastSign = "\\";// 压缩显示第一个目录名称标识 private final static String ReplaceSign = "";// 压缩显示第一个目录名称标识替换 private final static String CharSet = "GB18030";};

解决方案 »

  1.   

    先说LZ我喜欢LZ阔朗的性格  给起分来毫不含糊成大事者皆胸有大志且虚怀若谷  LZ恰似其中  望有一天楼主可以得意哇再说如何找到bug, 给LZ分享一篇我的日志,希望可以给楼主一点启发。再说bug你存就存2048个东西  开10240那么大的空间那后面的10240-2048的那些朋友是干什么的?    private final byte[] BufSum = new byte[10240]; // 缓冲区    private final int Buf = 2048; // 缓冲区fixed:    private final byte[] BufSum = new byte[1024]; // 缓冲区    private final int Buf = 1024; // 缓冲区无论天有多冷  风有多大  一头头总是在实验室里搞着Realtime java  楼主你也加油哇  看好你
      

  2.   


           public static void doZip(String zipName, File fullFile)
    throws Exception {
    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
    zipName));
    zip(out, fullFile, "");
    out.close();
    } private static void zip(ZipOutputStream out, File f, String base)
    throws Exception {
    if (f.isDirectory()) {
    File[] fl = f.listFiles();
    out.putNextEntry(new ZipEntry(base + "/"));
    base = base.length() == 0 ? "" : base + "/";
    for (int i = 0; i < fl.length; i++) {
    doZip(out, fl[i], base + fl[i].getName());
    }
    } else { 
    out.putNextEntry(new ZipEntry(base));
    FileInputStream in = new FileInputStream(f); 
    int b;
    while ((b = in.read()) != -1)
    out.write(b); 
    in.close();
    }

    }
      

  3.   

    谢谢啊~我理解错误了啊。我以为每次向缓冲里读一些数据,读够了才写啊,所以我把缓冲设置的比较大
    希望能多读一些在写。我有点不明白如果设置成1024,那如果最后不是剩下的不是整1024,那不是等于缓冲区还是设置大了吗?就是说读到文件最后的时候Buf不足1024,但BufSum还是1024,是不是还是有问题呢?
    java流这部分一直不是很懂。