文件压缩啊,可以直接执行,但是压缩出来的包总是不对啊,内容总是大很多不知道为什么啊?有人知道吗?

Kyle-soft 2011-04-09 01:42:02



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";

};

...全文
162 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
一头头 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zlyperson 的回复:]

我有点不明白如果设置成1024,那如果最后不是剩下的不是整1024,那不是等于缓冲区还是设置大了吗?就是说读到文件最后的时候Buf不足1024,但BufSum还是1024,是不是还是有问题呢?
java流这部分一直不是很懂。
[/Quote]

设置大了没有关系 流只读取有数据的部分
amos1989 2011-04-09
  • 打赏
  • 举报
回复
貌似楼上的已经解决了,楼主给分的姿势像我。。。一给就200
  • 打赏
  • 举报
回复

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();
}

}
Kyle-soft 2011-04-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 coldanimal 的回复:]
先说LZ

我喜欢LZ阔朗的性格 给起分来毫不含糊

成大事者皆胸有大志且虚怀若谷 LZ恰似其中 望有一天楼主可以得意哇

再说如何找到bug, 给LZ分享一篇我的日志,希望可以给楼主一点启发。


引用:一头头,FMS = formal specification

一头头把problem solving分成2个部分
1 是find problem
2 是solve p……
[/Quote]


谢谢啊~我理解错误了啊。我以为每次向缓冲里读一些数据,读够了才写啊,所以我把缓冲设置的比较大
希望能多读一些在写。我有点不明白如果设置成1024,那如果最后不是剩下的不是整1024,那不是等于缓冲区还是设置大了吗?就是说读到文件最后的时候Buf不足1024,但BufSum还是1024,是不是还是有问题呢?
java流这部分一直不是很懂。
sharkdoodoo 2011-04-09
  • 打赏
  • 举报
回复
mark下,晚上有时间绝对解决
一头头 2011-04-09
  • 打赏
  • 举报
回复
先说LZ

我喜欢LZ阔朗的性格 给起分来毫不含糊

成大事者皆胸有大志且虚怀若谷 LZ恰似其中 望有一天楼主可以得意哇

再说如何找到bug, 给LZ分享一篇我的日志,希望可以给楼主一点启发。

[Quote=引用:一头头,FMS = formal specification]

一头头把problem solving分成2个部分
1 是find problem
2 是solve problem

find problem 是指find root cause 找到问题真正的源头
如果一个问题很复杂无法理出一个头绪 无法有一个大概的猜想哪里会是root cause 就好像我的FMS一样 完全不知所措
在这种情况下 需要做的 1. 剥离问题 2. 验证正确的部分

剥离问题是指 把大问题分成若干个细小的sub problem 这些 sub-problem亦可被再分解成sub-sub-problem
当问题被足够细化成N个分支 就会出现一些常见的方法去验证这些分支的正确性
一旦每一个分支被验证 那个出问题的分支也就会被剥离出来 从而很容易就可以找到root cause

[/Quote]


再说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 楼主你也加油哇 看好你
OFDM通信系统Python实现源码 本资源提供了一套完整的正交频分复用通信系统仿真实现,采用Python编程语言开发。该实现涵盖了OFDM系统的主要构成模块,括: 核心功能模块: - 基带信号生成与QAM调制解调单元 - 串并转换与循环前缀添加机制 - 快速傅里叶变换及其逆变换处理单元 - 多径信道建模与均衡算法实现 - 符号定时与载波同步误差补偿 技术特性: 系统采用离散傅里叶变换实现频域并行传输,通过插入循环前缀有效对抗多径时延扩展。信道编码部分采用卷积码与交织器相结合的设计方案,有效提升系统抗突发错误能力。同步模块含精确定时同步和频偏估计补偿算法,确保系统在存在载波频率偏移和采样时钟偏差时仍能保持稳定工作。 实现细节: 代码结构采用模块化设计,各功能单元接口清晰明确。信道模型支持AWGN和多径瑞利衰落两种典型无线传输环境。性能评估模块可输出误码率曲线和星座图等关键指标,便于系统性能分析验证。 应用价值: 该实现可作为通信系统教学演示工具,也可为无线通信算法研究人员提供基础开发框架。所有源代码均采用标准Python语法编写,兼容主流科学计算库,具有较好的可移植性和扩展性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!

62,630

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧