IO流

IO流用来处理设备之间的数据传输

java对数据的操作是过流的方式

流按操作数据分为两种:字节流与字符流

流按流向分为:输入流,输出流。





IO流常用基类

字节流的抽象基类:InputStream OutputStream

字符流的抽象基类:Reader,Writer

由这四个类派生出来的子类名称都是以其父类作为子

类名的后缀。

如InputStream 的子类 FileInpuStream

Reader的子类FileReader





数据的最常见的形式是:文件





字符读取缓冲区:

class BufferedReaderDemo
{
	//创建一个读取流对象和文件相关联
	FileReader fr=new FileReader("buf.txt");
	//为了提高效率,加入缓冲技术,将字符流取对象作为参数传给缓冲对象的构造函数。
	//只要是文本文件,都是以行的形式存在的。
	//readLine返回的是该行的字符串,不包含任何行终止符,如果已经达到流的末尾,则返回null.
	BufferedReader bufr=new BufferedReader(fr);
	String line=null;
	while(line=bufr.readLine()!=null)
	{
		System.out.println(line);
	}
	bufr.close();

}

通过缓冲区复制一个.java文件到.txt文件:

class{
	public static void main(String[] args){
	BufferedReader bufr=null;
	BufferedWriter bufw=null;
	try{
		bufr=new BufferedReader(new FileReader("bufferwriteDemo.java"));
		bufw=new BufferedWriter(new FilerWriter("bufwriter.txt"));
		String line=null;//是两个流之间的中转站
		while(line=bufr.readLine()!=null){
			bufw.write(line);//读取一行
			bufw.newLine();//记得换行
			bufw.flush();//清空缓冲区数据
		}
	//下面是抛出异常
	}catch(IOException e){
		throw new RuntimeException("读取关闭失败");
	}
	finally{
		try{
		  if(bufr!=null)
		  bufr.close();
		}catch(IOException e){
			throw new RuntimeException("读取失败");
		}
		try{
		  if(bufr!=null)
		  bufr.close();
		}catch(IOException e){
			throw new RuntimeException("写入失败");
		}
	}

	}

}

readline方法的原理:无论是读一行或者读取多个字符,其实都是在硬盘上一个一个的读取,所以最终使用的还是read方法一次读一个的方法。读到一个字符以后只是把它存到一行里,当读到\r,因为它不读任何终止符,

这个时候,把数组里已经存好的字符返回出来。然后接着往下读。一直到读完。。readline比read方法高效。














做一个MyBufferedReader,自定义一个类中包含一个功能和readLine一致的方法,来模拟一个BufferedReader:

import java.io.*;
class MyBufferedReader{
	private FileReader r;
	MyBufferedReader(FileReader r) throws IOException{//抛出异常,下面就不用try,catch了
		this.r=r;//实例化

	}
	//可以一次读一行数据的方法
	public String myReadLine(){
		//定义一个临时容器,原Buffered装的是一个字符数组。定义一个StringBuilder容器,因为最终还是要将数据变成字符串。
		StringBuilder sb=new StringBuilder();
		int ch=0;
		while((ch=r.readLine())!=-1){
			if(ch=='\r')
			continue;
			if(ch=='\n')
			return sb.toString();
			else
			sb.append((char)ch);//在指定元素结尾插入字符

		}
		if(sb.length()!=0)
			return sb.toString();
		return null;
	}

	public void myClose()throws IOException{
		r.close();//模拟关闭流
	}

}

class MyBufferedReaderDemo{
	public static void main(String [] args){
		FileReader fr=new FileReader("buf.txt");
		MyBufferedReader myBuf=new MyBufferedReader(fr);//
		String line=null;
		while((line=myBuf.myReadLine()!=null){
			System.out.println("line");

		}
		myBuf.myClose();

	}
}

装饰者设计模式:

当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类称为装饰类。装饰者通常会通过构造对象方法接收被接收的对象,并基于被装饰的对象的功能。并提供更强的功能。

class Person{
	public void chifan(){
		System.out.println("吃饭");
	}
}
class SuperPerson{
	private Person p;
	SuperPersonn(Person p){
		this.p=p;
	}
	public void superChifan(){
		System.out.println("吃甜点");
		p.chifan();
		System.out.println("吃饭");
		System.out.println("打牌");
	}
}

class PersonDemo{
	public static void main(String [] args){
		Person p=new Person();
		//p.chifan();
		SuperPerson sp=new SuperPerson(p);
		sp.superChifan();
	}
}

装饰和继承的区别

MyReader//专门用于读取数据的类

继承:

|MyTextReader 文本读取

|MYBufferedTextReader

|MyMediaReader 媒体读取

|MyBufferedMediaReader

|MyDataReader

|MyBufferedDataReader

class MyBufferReader{
	MyBufferReader(MyTextReader text){
	}
	MyBufferReader(MyBufferedMediaReader media){
	}

}

上面这个类的扩展性极差,找到其参数的共同类型,可以提高扩展性





下面这个就是装饰设计模式,可以将这个体系优化

|MyTextReader 文本读取

|MyMediaReader 媒体读取

|MyDataReader

|MyBufferReader

装饰模式比继承要灵活,避免了继承了体系的冗余,而且降低了类与类之间的关系

装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能,所以装饰类和被装饰类通常是都属于一个体系中的。

MyReader//专门读取数据的类

class MyBufferReader{
	MyBufferReader(MyReader r){

	}
}
	

Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别的更多相关文章

  1. java基础之IO流(二)之字符流

    java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...

  2. Java基础之IO流整理

    Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...

  3. java基础之IO流(一)字节流

    java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...

  4. JAVA基础之IO流知识总结

    一.IO流体系图 IO常用的几个流: [I/O流原理作用] Input/Output:输入输出机制 输入机制:允许java程序获取外部设备的数据(磁盘,光盘,网络等). 输出机制:保留java程序中的 ...

  5. 黑马程序员——JAVA基础之IO流缓冲区,转换流,字节流

    ------- android培训.java培训.期待与您交流! ---------- 字符流的缓冲区        缓冲区的出现提高了对数据的读写效率. 对应类 •  BufferedWriter ...

  6. java基础之io流总结一:io流概述

    IO流概念: 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.io流是实现输入和输出的基础,可以方便的实现数据的输入和输出操作. IO流的分类: 根据处理数据类型的不同分为:字符流 ...

  7. 【java基础】]IO流

    IO流 概念: 流的概念源于unix中管道(pipe)的概念,在unix中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备,外部文件等 一个流,一定能够会有源和去向(目的地),他 ...

  8. Java基础之IO流学习总结

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  9. Java基础:IO流之字节流和字符流

    1. 流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. 一个流,必有源端和目的端 ...

随机推荐

  1. ●BZOJ 3796 Mushroom追妹纸

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3796 题解: 题意:    给出三个串 A,B,C    找出一个最长串 S,    使得 ...

  2. NOIP2014-5-10模拟赛

    Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧. 早苗的新模型可以按照输入的 ...

  3. HDU 4526 拼车记

    话说威威猫有一次去参加比赛,虽然学校离比赛地点不太远,但威威猫还是想坐出租车去.大学城的出租车总是比较另类,有“拼车”一说,也就是说,你一个人坐车去,还是一堆人一起,总共需要支付的钱是一样的(每辆出租 ...

  4. 【分解爪UVA11396-二分图染色模板】

    ·Rujia:"稍加推理即可解决该题--" ·英文题,述大意:      一张无向连通图,每个点连有三条边.询问是否可以将这个图分成若干个爪子,并满足条件:①每条边只能属于一个爪子 ...

  5. [bzoj4893]项链分赃

    来自FallDream的博客,未经允许,请勿转载,谢谢. 有一串长度为n(n<=10^5)的项链,上面有红绿蓝三种颜色的珠子,每种颜色的珠子数目都是偶数,现在要你把它切几刀分成若干段,把其中一些 ...

  6. SpringBoot学习之基础篇

    在前面的博文中,已经演示过springboot与Mybatis集成的实例,本篇再来探讨一下SpringBoot的基础.  一.关于SpringBoot SpringBoot可以基于Spring轻松创建 ...

  7. 使用JAXB解析xml文件(二)

    前面一章简单演示了JAXB的用法,这个章节主要梳理一下JAXB常见的几个注解 1.@XmlRootElement 用于类级别的注解,对应xml的跟元素,常与 @XmlType 和 @XmlAccess ...

  8. Python中内置函数的介绍

    内置函数的功能介绍 常用内置函数如下: 1.abs() 绝对值 格式:abs(x) 例如:print(abs(-18)) >>> 18 返回值:number #该函数主要用于数值类的 ...

  9. PAT甲级真题打卡:1001.A+B Format

    题目: Calculate a + b and output the sum in standard format -- that is, the digits must be separated i ...

  10. Android开发Java基础之Java语言基础(1)

    Java中的基本数据类型 整数类型 整数类型用来存储整数数值,既没有小数部分的数值.可以是正数,也可以是负数.整数类型在Java程序中有三种表现形式,分别是十进制,八进制,十六进制. 整型数据根据它所 ...