博学谷——让IT教学更简单,让IT学习更有效
}
}
}
try { } try { }
// 关闭流资源 fos.close();
e.printStackTrace();
throw new RuntimeException(\输出流关闭失败!\// 关闭流资源 fis.close();
e.printStackTrace();
throw new RuntimeException(\输入流关闭失败!\
} catch (IOException e) {
} catch (IOException e) {
程序运行结束后,打开target文件夹,发现source文件夹中的“IO流.avi”文件被成功拷贝到了target文件夹,如图8-4所示。
图8-4 拷贝结果
程序运行结束后,会在命令行窗口输出拷贝文件所消耗的时间,如图8-5所示:
图8-5 运行结果
从运行结果可以看出,使用自定义缓冲区拷贝大文件成功,而且耗时较短。
三、案例总结
1、由于计算机性能等各方面原因,会导致每次拷贝文件所消耗的时间未必相同。 2、在指定文件路径时使用了“\\\\”,这是因为在Windows目录路径基础上使用了转义符“\\”。 3、为了保证IO流的close()方法必须执行,通常将关闭流的操作写在finally代码块中。
4、思考一下:使用自定义缓冲区拷贝文件时效率高耗时短,请修改Example03类,在不使用缓冲区的情况下拷贝文件,打印所消耗的时间,并与使用缓冲区所耗时间比较。代码如下:
import java.io.FileInputStream;
6
博学谷——让IT教学更简单,让IT学习更有效
import java.io.FileOutputStream; import java.io.IOException; public class Example03 { }
public static void main(String[] args) { }
FileInputStream fis = null; FileOutputStream fos = null; try { }
// 创建文件字符输出流和文件字符输入流对象
fis = new FileInputStream(\流.avi\fos = new FileOutputStream(\流.avi\// 创建字节数组,用于缓存读取的字节 int len = 0;
long starttime = System.currentTimeMillis();// 获取拷贝文件前的系统时间 // 读取到文件结束时,返回-1
while ((len = fis.read()) != -1) { }
long overtime = System.currentTimeMillis();// 获取拷贝文件结束的系统时间 System.out.println(\拷贝文件消耗的时间为:\毫秒\e.printStackTrace();
throw new RuntimeException(\拷贝文件失败!\try { } try { }
// 关闭流资源 fos.close();
e.printStackTrace();
throw new RuntimeException(\输出流关闭失败!\// 关闭流资源 fis.close();
e.printStackTrace();
throw new RuntimeException(\输入流关闭失败!\// 将缓冲区中的数据写入文件 fos.write(len);
} catch (IOException e) {
} finally {
} catch (IOException e) {
} catch (IOException e) {
7
博学谷——让IT教学更简单,让IT学习更有效
案例8-4 装饰设计模式的应用
一、案例描述
1、 考核知识点
编 号:00108006 名 称: 装饰设计模式
2、 练习目标
? 了解什么是装饰设计模式 ? 掌握装饰设计模式的应用
3、 需求分析
装饰设计模式是通过包装一个类,动态地增强它的功能的一个设计模式,为了让初学者掌握装饰设计模式的应用,在案例将通过使用NewPerson类装饰Person类,完成为Person类增强“吃饭”功能来学习。
4、 设计思路(实现原理)
1) 编写Person类,定义eat()方法,表示“吃饭”功能
2) 编写NewPerson类,定义一个有参构造方法,通过构造方法可以将Person对象传入该类,在
NewPerson类定义newEat()方法,该方法对“吃饭”功能进行了扩展和增强。
3) 编写Example04测试类,在main()方法中,分别通过Person和NewPerson对象调用装饰前后
的吃饭功能。
二、案例实现
/** * 被装饰类 */
class Person { } /** * 装饰类 */
class NewPerson {
// 装饰类中拥有被装饰类的引用 private Person p;
// 构造方法传入被装饰类的对象 public NewPerson(Person p) { }
8
this.p = p; // 吃饭功能
public void eat(){ }
System.out.println(\正在吃饭\
博学谷——让IT教学更简单,让IT学习更有效
} /**
* 测试类Example04 */
public class Example04 { }
public static void main(String[] args) { }
System.out.println(\装饰前----\Person p = new Person(); p.eat();
System.out.println(\装饰后----\//使用NewPerson类来装修Person类
NewPerson np = new NewPerson(new Person()); np.newEat(); // 通过装饰类增强吃饭功能 public void newEat() { }
System.out.println(\饭前小酒\p.eat();
System.out.println(\抽一根烟\System.out.println(\饭后甜点\
运行结果如图8-6所示。
图8-6 运行结果
从运行结果可以看出,通过装饰设计模式成功增强了“吃饭”功能,达到预期效果。
三、案例总结
1、装饰设计模式具有以下特点:
(1) 装饰对象包含一个被装饰对象的引用。
(2) 装饰对象接受所有来自客户端的请求,再把这些请求转发给被装饰的对象。 (3) 装饰对象可以给被装饰对象增强功能。
(4) 一般情况下装饰和被装饰对象会具有相同的接口。
2、思考一下:装饰设计模式可以通过一个类增强另一个类的功能,而使用继承子类也可以对父类中的功能进行增强,针对增加功能这种情况请问使用装饰设计模式和继承有什么区别。
9
博学谷——让IT教学更简单,让IT学习更有效
案例8-5 字节缓冲流拷贝大文件
一、案例描述
1、 考核知识点
编 号:00108007 名 称: 字节缓冲流
2、 练习目标
? 了解什么是字节缓冲流 ? 了解字节缓冲流的优点
? 掌握如何使用字节缓冲流拷贝文件
3、 需求分析
我们学习过使用自定义缓冲区高效读写文件,其实Java自身也提供了两个带缓冲的字节流,分别是BufferedInputStream和BufferdOutputStream。为了熟悉这两个字节缓冲流的使用,案例中将通过使用字节缓冲流一次读写一个字节数组的方式拷贝文件来学习。
4、 设计思路(实现原理)
1) 在source目录下存放“IO流.avi”文件,并确保target目录下没有上次拷贝遗留的文件。 2) 编写Example05类。在main()方法中,分别创建缓冲字节输出流和缓冲字节输入流对象,并
指定拷贝文件的源及目标路径。
3) 定义一个字节数组作为缓冲区,缓冲输入流将源文件数据读取到缓冲区中,然后缓冲输出流
将缓冲区中数据写入到目标文件中,循环往复直到文件拷贝结束,并计算拷贝文件总耗时。 4) 使用close()方法,关闭流资源。
二、案例实现
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /**
* 字节缓冲流一次读写一个字节数组 */
public class Example05 {
public static void main(String[] args) {
BufferedInputStream bis = null; BufferedOutputStream bos = null; try {
bis = new BufferedInputStream(
new FileInputStream(\流.avi\\流.avi\
10
bos = new BufferedOutputStream(new FileOutputStream(
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库第8章 IO_补充案例(2)在线全文阅读。
相关推荐: