Java:IO系统与装饰模式

Java的IO流有三种分法:

①输入流、输出流:输入输出流都是以Java程序为参照的。

②字节流、字符流:字节是存储单位,占8位,其他基本数据类型都用字节来衡量大小。字符是数字字母等字符,ASCII和Unicode都是字符编码集,ASCII码是8位一个字节的,Unicode是16位两个字节的,而Java字符编码是采用Unicode的。字节流后缀是Stream,字符流后缀是Reader,Writer。

③节点流、处理流:节点流可以理解为真正处理数据的流,处理流是在节点流的基础上的修饰。

关于各种流的分类可以参考以下文章:http://blog.csdn.net/yuebinghaoyuan/article/details/7388059

实例一:用字节节点流FileInputStream、FileOutputStream和字符节点流FileReader、FileWriter读写文件

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Test {
	public static void main(String[] args) {
		FileInputStream fis = null;
		FileOutputStream fos = null;
		FileReader fr = null;
		FileWriter fw = null;
		try {
			fis = new FileInputStream("D:/From.txt"); // 在D盘新建一个From.txt文本文件,里面内容是abcd
			byte[] buffer = new byte[64]; // 将输入流的数据读取到字节数组
			int temp = fis.read(buffer);
			System.out.println(buffer[0]); // Unicode编码,所以打印出ASCII码97
			System.out.println(new String(buffer));
			fos = new FileOutputStream("D://To.txt"); // 将字节数组的数据写到To.txt文本文件
			fos.write(buffer, 0, temp); // 读写大文件用个while循环就可以

			fr = new FileReader("D:/From1.txt"); // 同上
			fw = new FileWriter("D:/To1.txt"); // 内容是zxcv
			char[] buf = new char[64];
			int temp1 = fr.read(buf);
			System.out.println(buf[0]);
			System.out.println(new String(buf));
			fw.write(buf, 0, temp1);
		} catch (FileNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} finally {                                        //将所有输入流和输出流关闭
			try {
				fis.close();
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			try {
				fos.close();
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			try {
				fr.close();
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			try {
				fw.close();
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		}
	}
}

打印结果:

97
abcd
z
zxcv

实例二:用修饰字符节点流FileReader的BufferedReader处理流来读写文件

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Test {
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		FileReader fr = null;
		BufferedReader br = null;
		try {
			fr = new FileReader("d:/From2.txt"); // 内容是第一行:abcd,第二行:efgh,第三行:ijk
			br = new BufferedReader(fr); // 传递的参数是一个节点字符流
			String line;
			while ((line = br.readLine()) != null) { // 此处理流比节点流多了个readLine方法,可以一次性读取一行
				System.out.println(line);
			}
		} catch (FileNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} finally {
			try {
				fr.close();
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			try {
				br.close();
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		}

	}
}

打印结果:

abcd
efgh
ijk

处理流就是在节点流的基础上添加一些功能,这是一种装饰模式。

实例三:简单的装饰模式理解

①新建一个Student接口

public interface Student {
	public void study();
}

②新建两个实现类

public class WenkeStudent implements Student {
	private String name;

	public WenkeStudent(String name) {
		this.name = name;
	}

	@Override
	public void study() {
		// TODO 自动生成的方法存根
		System.out.println(name+"学习文科");
	}
}
public class LiKeStudent implements Student {
	private String name;

	public LiKeStudent(String name) {
		this.name = name;
	}

	@Override
	public void study() {
		// TODO 自动生成的方法存根
		System.out.println(name + "学习理科");
	}
}

③新建一个装饰类

public class DecorateStudent {

	private Student student;   // 这是整个模式的关键,在装饰类中有一个被装饰者的接口引用
<span style="white-space:pre">				</span>   // 构造器中传进的参数则应是接口的实现类对象向上转型为接口<span style="white-space:pre">		</span>
	public DecorateStudent(Student student) {
		super();
		this.student = student;
	}

	public void study_well() {  // 添加两个修饰方法
		student.study();
		System.out.println("很强");
	}

	public void study_bad() {
		student.study();
		System.out.println("很差");
	}

}

④Main函数

public class Test {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		DecorateStudent decorateStudent = new DecorateStudent(new LiKeStudent(
				"张三"));
		decorateStudent.study_well();
		DecorateStudent decorateStudent2 = new DecorateStudent(
				new WenkeStudent("李四"));
		decorateStudent2.study_bad();
	}

}

打印结果:

张三学习理科
很强
李四学习文科
很差

和IO系统作为参照分析一下上面这个实例:Student接口相当于InputStream、OutputStream、Reader、Writer等基类;WenkeStudent、LikeStudent相当于FileInputstream、FileOutputStream、FileReader、FileWriter等继承类;DecorateStudent类相当于BufferedReader等处理流类;study_well方法就相当于readLine方法。这样对比应该就可以明白一点。

时间: 2024-10-06 07:43:14

Java:IO系统与装饰模式的相关文章

一文看懂java io系统 (转)

出处:  一文看懂java io系统 学习java IO系统,重点是学会IO模型,了解了各种IO模型之后就可以更好的理解java IO Java IO 是一套Java用来读写数据(输入和输出)的API.大部分程序都要处理一些输入,并由输入产生一些输出.Java为此提供了java.io包 java中io系统可以分为Bio,Nio,Aio三种io模型 关于Bio,我们需要知道什么是同步阻塞IO模型,Bio操作的对象:流,以及如何使用Bio进行网络编程,使用Bio进行网络编程的问题 关于Nio,我们需

第1章 Java IO系统

java.lang:java基础语言java.util:java工具包java.io:io--->input/output(文件),读写文件java.sql:操作数据 java.lang不需要导入,其他的包都需要用import导入 import java.io.File; ctrl+shift+o import java.io.*; java.io: File类:表示文件,不仅可以表示文件,还可以表示 目录 注意:不能对文件进行读写操作,只能查看文件的属性 文件属性:文件名.是文件还是目录.文件

java编程思想——java IO系统

一.什么是IO io在本质上是单个字节的移动.而流能够说是字节移动的载体和方式,它不停的向目标处移动数据.我们要做的就是依据流的方向从流中读取数据或者向流中写入数据. 二.java中支持IO操作的库类 1.依照数据类型分为两类: (1)字节类型:InputStream和OutputStream (2)字符类型:Writer和Reader 2.依照数据的流动方向,主要分为两类: (1)基于磁盘操作的io接口:File (2)基于网络的io接口:socket 三.字节流.字符流的io接口说明 字节流

装饰模式和Java IO

装饰模式 修饰模式(装饰模式),是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式.就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能. 装饰模式的UML如下所示: 装饰模式中有四个角色: Component 抽象构件,最基本.最核心.最原始的接口或抽象类 ConcreteComponent 具体构件的引用 Decorator 装饰角色, 持有对构件的引用 ConcreteDecorator 具体装饰角色 Java IO中的装饰模式 Java IO

JAVA IO 序列化与设计模式

?更多技术干货请戳:听云博客 序列化 什么是序列化 序列化:保存对象的状态 反序列化:读取保存对象的状态 序列化和序列化是Java提供的一种保存恢复对象状态的机制 序列化有什么用 将数据保存到文件或数据库中时 将数据通过套接字在网络上传输时 通过 RPC RMI等传输对象时 如何序列化 实现Serializable接口 实现Externalizable接口 serialVersionUID的作用serialVersionUID建议给一个确定的值,不要由系统自动生成,否则在增减字段(不能修改字段类

Java IO工作机制分析

Java的IO类都在java.io包下,这些类大致可分为以下4种: 基于字节操作的 I/O 接口:InputStream 和 OutputStream 基于字符操作的 I/O 接口:Writer 和 Reader 基于磁盘操作的 I/O 接口:File 基于网络操作的 I/O 接口:Socket 1 IO类库的基本结构 1.1 基于字节操作的IO接口 基于字节操作的IO接口分别是InputStream和OutputStream,InputStream的类结构图如下所示: 同InputStream

Java IO 装饰者模式

装饰模式(Decorator) 装饰模式又名包装(Wrapper)模式. 装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式通过创建一个包装对象,也就是装饰,来包裹真实的对象. 装饰模式以对客户端透明的方式动态地给一个对象附加上更多的责任.换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同. 装饰模式可以在不创造更多子类的情况下,将对象的功能加以扩展. 装饰模式把客户端的调用委派到被装饰类.装饰模式的关键在于这种扩展是完全透明的. 装饰模式的角色 抽象构件角色(

装饰器模式及JAVA IO流例子★★★☆☆

一.什么是装饰模式 通过关联机制给类增加行为,其行为的扩展由修饰对象来决定: 二.补充说明 与继承相似,不同点在于继承是在编译期间扩展父类,而装饰器模式在运行期间动态扩展原有对象: 或者说,继承是对类进行扩展,装饰模式是对对象进行扩展: 三.角色 抽象构件 具体构件 抽象装饰类 具体装饰类 说明:具体构件.抽象装饰类.具体装饰类的共同父类是抽象构件,具体装饰类继承抽象装饰类并在运行期间装饰具体构件: 四.例子 例子说明: 画家接口Painter,为抽象构件,有两个方法,获取画家描述信息及绘画:

java io系列01之 &quot;目录&quot;

javaIO系列转载出处:http://www.cnblogs.com/skywang12345/p/io_01.html 该分类所有博文,均转载同一作者,后边不再累赘标名. java io 系列目录如下: 01. java io系列01之  "目录" 02. java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream) 03. java io系列03之 ByteArrayOutputStream的简介,源码分析和示例(包括Ou