1、图书:Java从入门到精通第4版
2、章节:第15章 7.1节
3、实例:15.7
4、页数:第287页
5、
int b; // 定义int型变量
System.out.println(base);
while ((b = in.read()) != -1) { //
out.write(b); //此处b是怎么从int转换成byte的呢
全码:
import java.io.*;
import java.util.zip.*;
public class MyZip { // 创建类
private void zip(String zipFileName, File inputFile) throws Exception {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
zipFileName)); // 创建ZipOutputStream类对象
zip(out, inputFile, ""); // 调用方法
System.out.println("压缩中…"); // 输出信息
out.close(); // 将流关闭
}
private void zip(ZipOutputStream out, File f, String base)
throws Exception { // 方法重载
if (f.isDirectory()) { // 测试此抽象路径名表示的文件是否是一个目录
File[] fl = f.listFiles(); // 获取路径数组
out.putNextEntry(new ZipEntry(base + "/")); // 写入此目录的entry
base = base.length() == 0 ? "" : base + "/"; // 判断参数是否为空
for (int i = 0; i < fl.length; i++) { // 循环遍历数组中文件
zip(out, fl[i], base + fl[i]);
}
} else {
out.putNextEntry(new ZipEntry(base)); // 创建新的进入点
// 创建FileInputStream对象
FileInputStream in = new FileInputStream(f);
int b; // 定义int型变量
System.out.println(base);
while ((b = in.read()) != -1) { // 如果没有到达流的尾部
out.write(b); // 将字节写入当前ZIP条目
}
in.close(); // 关闭流
}
}
public static void main(String[] temp) { // 主方法
MyZip book = new MyZip(); // 创建本例对象
try {
// 调用方法,参数为压缩后文件与要压缩文件
book.zip("hello.zip", new File("src"));
System.out.println("压缩完成"); // 输出信息
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
David 发表于2017-05-02 17:56
http://docs.oracle.com/javase/8/docs/api/,读者可以查一下API,会发现在OutputStream中write()方法有三种形式:write(byte[] b)、write(byte[] b, int off, int len)和write(int b)。因为ZipOutputStream是OutputStream的子类,所以这里用的就是write(int b)。
例15.8也有问题 只能解压第一个子文件夹, 光盘中的语句也是只能解压一个子文件夹,且只能解压一个文件夹,不能解压文件
import java.io.*;
import java.util.zip.*;
public class Decompressing {
public static void main(String[] args){
File file=new File("D:/test.zip"); //file="hello.zip"
ZipInputStream zin;//创建ZipInputStream对象
try{
ZipFile zipFile=new ZipFile(file);//创建压缩文件对象
zin=new ZipInputStream(new FileInputStream(file));//实例化对象,指明要进行压缩的文件file
ZipEntry entry=zin.getNextEntry();//创建输出流位置
while(((entry=zin.getNextEntry())!=null)&&!entry.isDirectory()){//当输出流位置不为空且目录不存在
File tmp=new File("c:\\"+entry.getName());//确定待解压文件,解压后的路径
System.out.println(entry+"| |"+tmp);
if(!tmp.exists()){//如果解压路径不存在
tmp.getParentFile().mkdirs();//创建文件父类文件夹路径
OutputStream os=new FileOutputStream(tmp);//将文件放入输出流
InputStream in=zipFile.getInputStream(entry);//用输入流读取压缩文件指定位置的文件
int count=0;
while((count=in.read())!=-1){//如果输入流存在数据
os.write(count);
}
os.close();
in.close();
}
zin.closeEntry();
System.out.println(entry.getName()+"解压成功");
}
zin.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
光盘中的:
public class Decompressing { // 创建文件
public static void main(String[] temp) {
ZipInputStream zin; // 创建ZipInputStream对象
try { // try语句捕获可能发生的异常
zin = new ZipInputStream(new FileInputStream("D:/test.zip"));
// 实例化对象,指明要进行解压的文件
ZipEntry entry = zin.getNextEntry(); // 获取下一个ZipEntry
while (((entry = zin.getNextEntry()) != null)
&& !entry.isDirectory()) {
// 如果entry不为空,并不在同一目录下
File file = new File("c:\\" + entry.getName()); // 获取文件目录
System.out.println(file);
if (!file.exists()) { // 如果该文件不存在
file.mkdirs();// 创建文件所在文件夹
file.createNewFile(); // 创建文件
}
zin.closeEntry(); // 关闭当前entry
System.out.println(entry.getName() + "解压成功");
}
zin.close(); // 关闭流
} catch (Exception e) {
e.printStackTrace();
}
}
}
读者压缩文件可参考链接http://blog.csdn.net/sxdtzhaoxinguo/article/details/20550537;
解压缩可参照附件中的源码:
David 发表于2017-05-03 18:31
读者压缩文件可参考链接http://blog.csdn.net/sxdtzhaoxinguo/article/details/20550537;
解压缩可参照附件中的源码:
源码不能用啊
David 发表于2017-05-03 18:31
读者压缩文件可参考链接http://blog.csdn.net/sxdtzhaoxinguo/article/details/20550537;
解压缩可参照附件中的源码:
解压的源码不能用,谢谢