Java I/O---添加属性和有用的接口—FilterlnputStream&FilterOutputStream

0.装饰器模式

Java I/O类库需要多种不同功能的组合,这正是使用装饰器模式的理由所在。这也是Java I/O类库里存在filter(过滤器)类的原因所在,抽象类filter是所有装饰器类的基类。装饰器必须具有和它所装饰的对象相同的接口,但它也可以扩展接口,而这种情况只发生在个别  filter类中。

但是,装饰器模式也有一个缺点:在编写程序时,它给我们提供了相当多的灵活性(因为我们可以很容易地混合和匹配属性),但是它同时也增加了代码的复杂性。Java I/O类库操作不便的原因在于:我们必须创建许多类一一“核心”I/O类型加上所有的装饰器,才能得到我们所希望的单个I/O对象。

1.FilterlnputStreamFilterOutputStream

FilterlnputStreamFilterOutputStream用来提供装饰器类接口以控制特定输入流( InputStream)和输出流(OutputStream)的两个类,它们的名字并不是很直观。FilterInput-Stream和FilteOutputStream分别自I/O类库中的基类InputStreain和OutputStream派生而来,这两个类是装饰器的必要条件(以便能为所有正在被修饰的对象提供通用接口)。

(1)JDK API 中 FilterlnputStream类

(2)JDK API 中 FilterOutputStream

2.BufferedInputStream & BufferedOutputStream

BufferedInputStream是带缓冲区的输入流,默认缓冲区大小是8M,能够减少访问磁盘的次数,提高文件读取性能;

BufferedOutputStream是带缓冲区的输出流,能够提高文件的写入效率。

BufferedInputStream与BufferedOutputStream分别是FilterInputStream类和FilterOutputStream类的子类,实现了装饰设计模式。下面是例子演示使用BufferedInputStream和BufferedOutputStream实现照片复制

  1 public class CopyPicByBuffer {
  2
  3 	public static void main(String[] args) throws IOException {
  4 		/**
  5 		 * 使用BufferedInputStream和BufferedOutputStream实现照片复制
  6 		 */
  7 		copyPicByBuffer();
  8 	}
  9
 10 	private static void copyPicByBuffer() throws IOException {
 11 		// TODO Auto-generated method stub
 12 		//演示缓冲区
 13 		//1.创建输入流对象
 14 		FileInputStream fis = new FileInputStream("H:\\workspace\\Testfile\\1.jpg");
 15 		BufferedInputStream bufis = new BufferedInputStream(fis);//装饰设计模式
 16
 17 		//2.创建输出流对象
 18 		FileOutputStream fos = new FileOutputStream("H:\\workspace\\Testfile\\1-copybybuffer.jpg");
 19 		BufferedOutputStream bufos = new BufferedOutputStream(fos);//装饰设计模式
 20
 21 		int by = 0;
 22 		while((by = bufis.read()) != -1){
 23 			bufos.write(by);
 24 			bufos.flush();//刷新
 25 		}
 26 		fos.close();
 27 		fis.close();
 28 		System.out.println("复制结束!");
 29 	}
 30 }
 31 

2017-12-31 内容来自Java编程思想和传智播客课程

BufferedInputStream与BufferedOutputStream用法简介

原文地址:https://www.cnblogs.com/zhuweiheng/p/8157152.html

时间: 2024-10-20 20:01:48

Java I/O---添加属性和有用的接口—FilterlnputStream&FilterOutputStream的相关文章

JAVA“动态”为类添加属性

部分参考:http://www.cnblogs.com/zy2009/p/6725843.html pom.xml中添加: <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version> </dependency> <dependenc

【深入JAVA】对xml节点添加属性

在阅读的过程中有任何问题,欢迎一起交流 邮箱:[email protected]    QQ:1494713801 对xml中的节点<module name="test">添加属性节点为<module load="false" name="test">> Java代码: try { builder = factory.newDocumentBuilder(); } catch (ParserConfiguration

PropertyGrid—添加属性Tab

零.引言 PropertyGrid用来显示和编辑对象的属性,前面已经简单介绍了如何使用该控件和提供不同的属性编辑方法.前面主要讲如何使用该控件,但有时,该控件无法满足我们的需求,就需要对其进行扩展.本文主要介绍如何在PropertyGrid中添加属性选项卡(PropertyTab).VS自带的属性框有属性和事件两个属性卡,下面简单说明如何添加自己的选项卡. 一.PropertyGrid的组成 在添加选项卡之前,先来看一看PropertyGrid的组成,分析其组成对后面设计十分有用.微软将Prop

Java solrj client 添加JavaEntity Bean

Java类中字段属性添加field注释例如 public class Document {    // 文献信息    @Field    private String id; // 文献的id    @Field    private String entitype;// 表名    @Field    private String authors; // 文献的作者    @Field    private String title; // 文献标题    @Field    private

java 对象转JSON 属性为空

Java 对象转JSON 属性为空,请检查 类中属性是否带有标准的GET和SET方法 for example: public class example  implements Serializable { public String entityName; public String dataSourceName; public String entityVarName; public String pcChName; public String pcName; public List<DBC

前端-jq创建标签/添加属性/css属性

jq创建标签 var ptag = $('<p>'); jq添加属性如href,id,class,name等 $('#content').attr('class/id/name/href', 'active') $('#id').html('标签的文本') $('#input).val('xxxxxxx') jq添加style属性即css,如width,height,text_aling $("div").css({"background-color":

js/java 获取、添加、修改、删除cookie(最全)

一.cookie介绍 1.cookie的本来面目 HTTP协议本身是无状态的.什么是无状态呢,即服务器无法判断用户身份.Cookie实际上是一小段的文本信息(key-value格式).客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie.客户端浏览器会把Cookie保存起来.当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器.服务器检查该Cookie,以此来辨认用户状态. 2.cookie本来运行机制 当用户第一

跟陈湾来完善C++(2), 添加属性功能

上面几篇文章中,我们添加了名称空间优化,添加事件功能.这些对我来说其实已经够了.但还可以加一个属性功能. 当我们在C++中更改一个属性时,平常都是Get函数加上Set函数,但是这样,没有直接写一个成员变量方便.例如: a.SetValue(a.GetValue() + 1); 没有 a.Value = a.Value + 1; 方便. 但是这种方便只有在调用有属性功能的对象时才能使用.在创建属性的时候我还是用老套路,写一个Get和Set函数,该干啥还是干啥.我的属性功能其实就是在类中添加一个共有

runtime-给系统已有类添加属性

在没有接触runtime之前,我们接触到的能给类进行扩展的方法有类目(category)和延展(extension)两种.类目(category)可以给系统已有类添加扩展方法但是不能添加属性,并且被添加的方法可以被此类的子类所继承:延展(extension)为我们的自定义类添加属性和方法,但是添加的属性和方法都是私有的,在此类的子类中是无法访问的.那么问题来了,如果我们想给系统已有类添加一些方便我们使用的属性要怎么办呢?上述这两种方法中能给系统已有类添加的东西的就只有类目(category)了.