/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package ZipFramework;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.CRC32;
/**
*
* @author Neill Harper
*/
public class FileData extends ZIPObject {
private static final int DECRYPT_HEADER_SIZE = 12;
private static final String INIT = "未开始";
private static final String EXTRACT = "解压中";
private static final String EXTRACTCOMPLETE = "解压完成";
private static final String VALIDATE = "验证密码中";
private File tempFile;
private FileEntry parent;
private CRC32 crc32;
private int[] keys = new int[3];
private int complete = 0;
private String state = INIT;
private int[] crcNums = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832,
0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd,
0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148,
0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f,
0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e,
0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd,
0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac,
0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2,
0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589,
0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934,
0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97,
0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6,
0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49,
0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074,
0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73,
0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409,
0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320,
0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af,
0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e,
0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d,
0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0,
0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43,
0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda,
0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0,
0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7,
0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226,
0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785,
0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4,
0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b,
0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca,
0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661,
0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f,
0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e,
0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1,
0x5a05df1b, 0x2d02ef8d };
public FileData(FileEntry Parent) throws IOException {
parent = Parent;
tempFile = File.createTempFile("zip", null);
this.fillTempFile();
}
public String getState(){
return state;
}
public String getProcess(){
if(state.equals(EXTRACT))
return complete + "/" + parent.compressedSize + " " + complete*100/parent.compressedSize + "%";
else
return "";
}
protected byte[] GetOutput() {
FileInputStream output = null;
byte[] outBytes = new byte[(int) tempFile.length()];
try {
output = new FileInputStream(tempFile);
output.read(outBytes, 0, outBytes.length);
return outBytes;
} catch (FileNotFoundException ex) {
Logger.getLogger(FileData.class.getName()).log(Level.SEVERE, null,
ex);
} catch (IOException ioE) {
Logger.getLogger(FileData.class.getName()).log(Level.SEVERE, null,
ioE);
} finally {
try {
output.close();
} catch (IOException ex) {
Logger.getLogger(FileData.class.getName()).log(Level.SEVERE,
null, ex);
}
}
return outBytes;
}
private void fillTempFile() throws FileNotFoundException, IOException {
if (this.parent.getFilePath().exists()) {
switch (parent.getLfh().getMethod().getMethodValue()) {
case Method.Stored:
storedCompression();
break;
case Method.Deflated:
deflateCompression();
break;
default:
throw new UnsupportedOperationException("Not supported yet.");
}
if (this.parent.getPassword() != null) {
EncryptFileData();
}
this.parent.getLfh().setCompressedSize((int) tempFile.length());
}
}
/**
* 解密数据,无密码直接返回true
* @param in
* @return boolean, 返回false表示密码错误
* @throws UnsupportedEncodingException
* @throws IOException
*/
public boolean DecryptFileData(MyZipInputStream in)
throws UnsupportedEncodingException, IOException {
FileOutputStream output = null;
state = FileData.EXTRACT;
complete = 0;
//无密码
if(this.parent.getPassword() == null){
output = new FileOutputStream(tempFile);
byte[] inBytes = new byte[1024];
int numberRead = 0;
int len = this.parent.compressedSize;
while (complete<len && (numberRead = in.read(inBytes, 0, 1024)) != -1) {
output.write(inBytes);
complete += numberRead;
}
state = FileData.EXTRACTCOMPLETE;
return true;
}else{
//有密码
try {
output = new FileOutputStream(tempFile);
byte[] encBuf = new byte[DECRYPT_HEADER_SIZE];
in.read(encBuf, 0, encBuf.length);
initKeys(this.parent.getPassword());
for (int i = 0; i < DECRYPT_HEADER_SIZE; i++) {
updateKeys((byte) (encBuf[i] ^ DecryptByte()));
complete++;
}
byte[] inBytes = new byte[1];
int numberRead = 0;
int len = this.parent.compressedSize;
while (complete<len && (numberRead = in.read(inBytes, 0, 1)) != -1) {
inBytes[0] = (byte)((inBytes[0] ^ DecryptByte()) & 0xff);
updateKeys(inBytes[0]);
output.write(inBytes[0]);
complete += numberRead;
}
} finally {
output.close();
}
state = FileData.EXTRACTCOMPLETE;
return checkPassword();
}
}
private boolean checkPassword() throws FileNotFoundException, IOException {
this.state = FileData.VALIDATE;
boolean result = false;
switch (parent.getLfh().getMethod().getMethodValue()) {
case Method.Stored:
result = checkStoredCompression();
break;
default:
throw new UnsupportedOperationException("Not supported yet.");
}
return result;
}
private void initKeys(String password) throws UnsupportedEncodingException{
keys[0] = 305419896;
keys[1] = 591751049;
keys[2] = 878082192;
没有合适的资源?快使用搜索试试~ 我知道了~
Java实现的带密码压缩与解压zip文件源码
共19个文件
java:19个
4星 · 超过85%的资源 需积分: 48 42 下载量 144 浏览量
2012-11-27
20:02:45
上传
评论 1
收藏 22KB ZIP 举报
温馨提示
Java实现的带密码压缩与解压zip文件源码,可将多个文件使用不同的密码压进同一个zip文件;可以解压带密码的zip文件(store压缩模式)
资源推荐
资源详情
资源评论
收起资源包目录
ZipFramework.zip (19个子文件)
src
ZipFramework
DOSDateTime.java 2KB
MyZipInputStream.java 8KB
FileHeaderBase.java 1KB
FileData.java 11KB
InflaterInputStream.java 6KB
LocalFileHeader.java 2KB
FileEntry.java 2KB
EndOfCentralDirectoryHeader.java 2KB
ZipConstants.java 3KB
UnZip.java 3KB
ZIPObject.java 2KB
DataHeaderBase.java 905B
ZIPFile.java 2KB
Method.java 984B
CentralDirectoryFileHeader.java 3KB
HeaderBase.java 254B
Main.java 2KB
GPBitFlag.java 1KB
DataDescriptor.java 743B
共 19 条
- 1
资源评论
- taozi36462013-01-05不太适合我目前的项目,不过还是感谢楼分享
- bulecup2014-04-26我是java学习的新手,部分代码看起来有些吃力,不过整体还不错啦
- aini99yy2014-09-18还可以 值得借鉴
xbelm
- 粉丝: 0
- 资源: 17
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功