已有101人关注
int b;while ((b = in.read()) != -1)//此处b是怎么从int转换成byte的呢
发表在Java图书答疑 2017-05-01
是否精华
版块置顶:

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

}

}

}


分享到:
精彩评论 9
xyyxhcj
学分:20 LV2
2017-05-01
沙发

zip(out, fl[i], base + fl[i]); 另这条语句会导致压缩路径与实际路径不符,应改为

zip(out,fl[i],""+fl[i]);

David
学分:914 LV7
TA的每日心情
最后的冲刺
2017-07-15 10:46:08
2017-05-02
板凳

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)。

xyyxhcj
学分:20 LV2
2017-05-02
地板

例15.08的也有问题,只能压缩第一个子文件夹 光盘里的代码不同,但是也是只能压缩文件夹里的第一个文件,且只能压缩文件夹,无法压缩文件

xyyxhcj
学分:20 LV2
2017-05-02
4L

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

}

}

}


xyyxhcj
学分:20 LV2
2017-05-02
5L

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)。

第一张图是光盘里的代码,第二张是压缩时的原文件,第三张是解压后的文件,只有一个image.pngimage.pngimage.png

David
学分:914 LV7
TA的每日心情
最后的冲刺
2017-07-15 10:46:08
2017-05-03
6L

读者压缩文件可参考链接http://blog.csdn.net/sxdtzhaoxinguo/article/details/20550537;

解压缩可参照附件中的源码:

Decompressing.rar


xyyxhcj
学分:20 LV2
2017-05-04
7L

David 发表于2017-05-03 18:31

读者压缩文件可参考链接http://blog.csdn.net/sxdtzhaoxinguo/article/details/20550537;

解压缩可参照附件中的源码:

Decompressing.rar


image.png源码不能用啊

xyyxhcj
学分:20 LV2
2017-05-04
8L

David 发表于2017-05-03 18:31

读者压缩文件可参考链接http://blog.csdn.net/sxdtzhaoxinguo/article/details/20550537;

解压缩可参照附件中的源码:

Decompressing.rar


解压的源码不能用,谢谢

David
学分:914 LV7
TA的每日心情
最后的冲刺
2017-07-15 10:46:08
2017-05-04
9L

读者没改源码么?错误发生在第17行和第31行,我这里测试源码没问题,我解压的是eclipse-jee-neon-1a-win32.zip。

首页上一页 1 下一页尾页 9 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照