⑴ java中zip压缩输入输出流的问题,ZipEntry()方法里的参数到底什么意思
ZipEntry 用于保存一些被压缩文件的信息,如文件名,最后访问时间,最后修改时间,创建时间,文件大小,crc 校验值 等信息。
ZipEntry 具有一个带 String 类型参数的构造方法:ZipEntry(String name), name 是入口名称,就是打开压缩文件时,看到的里面的文件名称。
可以看一下它的源码,下面是部分源码:
public
,Cloneable{
Stringname;//entryname
longtime=-1;//lastmodificationtime
FileTimemtime;//lastmodificationtime,fromextrafielddata
FileTimeatime;//lastaccesstime,fromextrafielddata
FileTimectime;//creationtime,fromextrafielddata
longcrc=-1;//crc-32ofentrydata
longsize=-1;//uncompressedsizeofentrydata
longcsize=-1;//compressedsizeofentrydata
intmethod=-1;//compressionmethod
intflag=0;//generalpurposeflag
byte[]extra;//
Stringcomment;//optionalcommentstringforentry
...
}
⑵ java中如何将一个zip文件转为byte数组
input1.read(data1);
这一句执行好data1 就是文件的byte数组了!!!
String str = new String(data1);//转换成专string
下面不要了属
for (int length1 = 0; (length1 = input1.read(data1)) > 0;) { output.write(data1, 0, length1); }
⑶ JAVA 压缩和序列化
压缩和序列化主要用在数据的存储和传输上,二者都是由IO流相关知识实现,这里统一介绍下。
全部章节传送门:
Java I/O类支持读写压缩格式的数据流,你可以用他们对其他的I/O流进行封装,以提供压缩功能。
GZIP接口比较简单,适合对单个数据流进行压缩,在Linux系统中使用较多。
ZIP格式可以压缩多个文件,而且可以和压缩工具进行协作,是经常使用的压缩方法。
JAR(Java Archive,Java 归档文件)是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。为 J2EE 应用程序创建的 JAR 文件是 EAR 文件(企业 JAR 文件)。
JAR 文件格式以流行的 ZIP 文件格式为基础。与 ZIP 文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。在 JAR 中包含特殊的文件,如 manifests 和部署描述符,用来指示工具如何处理特定的 JAR。
如果一个Web应用程序的目录和文件非常多,那么将这个Web应用程序部署到另一台机器上,就不是很方便了,我们可以将Web应用程序打包成Web 归档(WAR)文件,这个过程和把Java类文件打包成JAR文件的过程类似。利用WAR文件,可以把Servlet类文件和相关的资源集中在一起进行发布。在这个过程中,Web应用程序就不是按照目录层次结构来进行部署了,而是把WAR文件作为部署单元来使用。
一个WAR文件就是一个Web应用程序,建立WAR文件,就是把整个Web应用程序(不包括Web应用程序层次结构的根目录)压缩起来,指定一个.war扩展名。下面我们将第2章的Web应用程序打包成WAR文件,然后发布
要注意的是,虽然WAR文件和JAR文件的文件格式是一样的,并且都是使用jar命令来创建,但就其应用来说,WAR文件和JAR文件是有根本区别的。JAR文件的目的是把类和相关的资源封装到压缩的归档文件中,而对于WAR文件来说,一个WAR文件代表了一个Web应用程序,它可以包含 Servlet、HTML页面、Java类、图像文件,以及组成Web应用程序的其他资源,而不仅仅是类的归档文件。
在命令行输入jar即可查看jar命令的使用方法。
把对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
只有实现了Serializable的对象才能被序列化。对象序列化包括如下步骤:
对象反序列化的步骤如下:
创建一个可以可以序列化的对象。
然后进行序列化和反序列化测试。
serialVersionUID: 字面意思上是序列化的版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量。
JAVA序列化的机制是通过判断类的serialVersionUID来验证的版本一致的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID于本地相应实体类的serialVersionUID进行比较。如果相同说明是一致的,可以进行反序列化,否则会出现反序列化版本一致的异常,即是InvalidCastException。
为了提高serialVersionUID的独立性和确定性,强烈建议在一个可序列化类中显示的定义serialVersionUID,为它赋予明确的值。
控制序列化字段还可以使用Externalizable接口替代Serializable借口。此时需要定义一个默认构造器,否则将为得到一个异常(java.io.InvalidClassException: Person; Person; no valid constructor);还需要定义两个方法(writeExternal()和readExternal())来控制要序列化的字段。
如下为将Person类修改为使用Externalizable接口。
transient修饰符仅适用于变量,不适用于方法和类。在序列化时,如果我们不想序列化特定变量以满足安全约束,那么我们应该将该变量声明为transient。执行序列化时,JVM会忽略transient变量的原始值并将默认值(引用类型就是null,数字就是0)保存到文件中。因此,transient意味着不要序列化。
静态变量不是对象状态的一部分,因此它不参与序列化。所以将静态变量声明为transient变量是没有用处的。
⑷ PHP gzip 压缩后和 java deflate 数据不一致的问题
gzinflate 是解压 gzdeflate 数据来的啊,现在是想压缩后和自 java deflate 压缩的数据一致。又看了下资料,java Deflater(int level,boolean nowrap) 压缩,如果参数 'nowrap' 为 true,则不使用 ZLIB 头和校验和字段,默认好像是 false。而采用 PHP gzencode ($data , -1, FORCE_DEFLATE ) 进行压缩,只是带了zlib headers 信息,没有带 crc32 checksum,可能问题就在这儿,但是还不知道怎么解决,还请好心的版主给点建议!
⑸ java中的压缩原理是什么
JRE就是一个压缩文件,这跟WINRAR用来压缩文件是一样的,并不是文件变大了或变小了,只是所有的文件都压在一个包下,看起来不会乱。压缩包下的路径一样有用。 答案补充 由于计算机处理的信息是以二进制数的形式表示的,因此压缩软件就是把二进制信息中相同的字符串以特殊字符标记来达到压缩的目的。对于成千上万单调重复的0和1而言,与其一个一个定义000000…111…长长的一串,还不如告诉电脑:“从这个位置开始存储1117个1”来得简洁,而且还能大大节约存储空间。这是一个非常简单的压缩的例子。其实,所有的计算机文件归根结底都是以“1”和“0”的形式存储的,只要通过合理的数学计算公式,文件的体积都能够被大大压缩以达到“数据无损稠密”的效果。总的来说,压缩可以分为有损和无损压缩两种。如果丢失个别的数据不会造成太大的影响,这时忽略它们是个好主意,这就是有损压缩。有损压缩广泛应用于动画、声音和图像文件中,典型的代表就是影碟文件格式mpeg、音乐文件格式mp3和图像文件格式jpg。但是更多情况下压缩数据必须准确无误,人们便设计出了无损压缩格式,比如常见的zip、rar等。压缩软件(compression software)自然就是利用压缩原理压缩数据的工具,压缩后所生成的文件称为压缩包(archive),体积只有原来的几分之一甚至更小。
⑹ java :怎么实现分批次导出excel的条数限制,每次导出的excel压缩成zip,并且导出时给用户添加友好提示
你这问题太大了
HSSFWorkbook 是导出的工具,可是实现导出excel控制条数
//开始打印
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet=wb.createSheet("sheet1");
HSSFRow row = sheet.createRow(0);
//设置第一行标题
HSSFCell cell;
JobColumn jobColumn = null;
int colsAddSize = NewmasterstudentAction.COLS4EXPORT_CODE.length;
for(int i=0 ; i<colsAddSize ; i++){
cell = row.createCell((short)i);
cell.setCellValue(NewmasterstudentAction.COLS4EXPORT_CODE[i]+"("+NewmasterstudentAction.COLS4EXPORT_NAME[i]+")");
}
for(int i=0;i<jobList.size();i++){
UserJobColumn userJob = jobList.get(i);
jobColumn = userJob.getJobColumn();
cell = row.createCell((short)(i+colsAddSize));
cell.setCellValue(jobColumn.getColumnCode()+"("+jobColumn.getColumnName()+")"); //字段代码
}
//打印记录
Set<Entry<String,List<JobRecord>>> entrySet = des.entrySet();
Iterator<Entry<String, List<JobRecord>>> it = entrySet.iterator();
int index = 1;
while(it.hasNext()){
Entry<String, List<JobRecord>> en = it.next();
row = sheet.createRow(index++);
String xh = en.getKey();
//打印学生信息
cell = row.createCell((short)0);
cell.setCellValue(xh);
NewMasterStudent stu = studentMap.get(xh);
if(stu != null){
cell = row.createCell((short)1);
cell.setCellValue(stu.getYbd() ? "是" : "否");
cell = row.createCell((short)2);
cell.setCellValue(stu.getRemark() == null ? "" : stu.getRemark());
}
//打印记录
List<JobRecord> records = en.getValue();
for(int i=0 ; i <jobList.size() ; i++){
cell = row.createCell((short)(i+colsAddSize));
UserJobColumn g = jobList.get(i);
JobRecord record = null;
if(i < records.size()){
record = records.get(i);
if(!g.getJobColumn().getId().equals(record.getJobColumn().getId())){
record = new JobRecord();
record.setJobColumn(g.getJobColumn());
records.add(i, record);
}
}else{
record = new JobRecord();
record.setJobColumn(g.getJobColumn());
records.add(i, record);
}
if(Constant.NS_JOBCOLUMN_TYPE_INPUT.equals(record.getJobColumn().getColumnType())){
cell.setCellValue(record.getEditLr());
}else if(Constant.NS_JOBCOLUMN_TYPE_SELECT.equals(record.getJobColumn().getColumnType())){
cell.setCellValue(record.isEditState() ? "是":"否");
}else if(Constant.NS_JOBCOLUMN_TYPE_OPTION.equals(record.getJobColumn().getColumnType())){
SyGeneralCode select = record.getSelectedValue();
if(select != null){
cell.setCellValue(select.getCode()+" | "+select.getCnName());
}
}
}
}
ZipEntry 可以实现导出zip文件
if (files[i].exists() && !files[i].isDirectory()) {
String zjhmImg = files[i].getName();
if (zjhmMap.get(zjhmImg) != null) {
num++;
FileInputStream fi = new FileInputStream(files[i]);
origin = new BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry(files[i].getName());
out.putNextEntry(entry);
int count;
while ((count = origin.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
out.setEncoding("GBK");
origin.close();