黑马程序员_IO

-----------------------------------------------------------------android培训java培训、期待与您交流! ---------------------------------------------------------------  


IO流

IO流用来处理设备之间的数据传输,Java对数据的操作是通过流方式

Java用于操作流的对象都在IO包中

 

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

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

 

IO流常用基类

字节流的抽象基类

InputStream,OutputStream

字符流的抽象基类

Reader,Writer

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

 

一、字符流

Writer

方法:

write() :写字符数据

flush() :刷新流对象中的缓冲的数据,将数据刷到目的地中

              如果只write()操作并没有flush(),那么数据还在内存中,目的地是没有数据的。

close() :关闭流资源,但是关闭之前会刷新一次内部的缓冲数据。

flush与close的区别:flush刷新后,流可以继续使用,close刷新后,流会被关闭。

append() :对已有文件数据续写--------对应构造函数FileWriter(Filefile, boolean append)

                                                                             FileWriter(Stringfilename, boolean append)

在IO流中很多方法都会抛出IO异常,那么IO异常该如何处理?

标准处理程序:

 

public static void main(String[] args) {
		FileWriter fw = null;
		try {
			fw = new FileWriter("file.txt");
			fw.write("ddddd");
		}catch(IOException e) {
			System.out.println(e.toString());
		}finally {

			try {
				if(fw != null)
					fw.close();
			}catch(IOException e) {
				System.out.println(e.toString());
			}

		}
	}

Reader

方法:

read() :一次读一个字符,并且自动往下读,如果到末尾,返回-1

read(char[] charf) :返回读取字符个数

read(char[] cbuf, int off, int len) :读取指定一段字符

close() :关闭流

 

文件读写流

FileWriter

FileReader

该两个流并没有扩充方法,与父类Writer和Reader相同

 

缓冲区技术 :为了提高流操作效率而出现的,所以在创建缓冲区之前,必须要先有流对象

BufferedWriter

方法:

write(int c)

write(char[] cbuf,int off, int len)

write(String s,int off, int len)

flush()

close()

newLine():该缓冲区中提供了一个跨平台的换行符,可以实现换行

close :其实关闭缓冲区就是在关闭缓冲区中的流对象,所以关闭缓冲区就不必关流了

 

BufferedReader

方法:

read()

read(char[] cbuf,int off, int len)

readLine():缓冲区提供了一个新的方法,一次可以读取一行文本,当返回null时,表示读到文件末尾

readLine读取并不包括换行符

 

装饰设计模式

想对已有对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么定义的该类称为装饰类。

装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。

 

装饰和继承的区别:

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

所以如果新的类只是扩展了原有类的几个方法的话,为了避免体系臃肿可以优先考虑装饰类。

 

装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能

所以装饰类与被装饰类通常都属于一个体系

 

BufferedReader的子类:

LineNumberReader

给类提供两个增强方法:设置和获取行号

setLineNumber(int lineNumber)

getLineNumber()

 

字节流

InputStream

OutputStream

所提供的方法与Reader和Writer的方法类似,传入的是字符或者是字符数组

 

字节流缓冲区

BufferedInputStream

BufferedOutputStream

字节流缓冲区的使用类似于字符流缓冲区的使用

 

读取键盘录入

System.in :对应的是标准输出设备。in是一个InputStream类型

System.out :对应的是标准输出设备,控制台。out是一个OutputStream类型

 

转换流

InputStramReader 字节通向字符的桥梁----读取键盘输入转换字符流

OutputStreamWriter 字符通向字节的桥梁---将字符流转成字节流输出


如何分析要使用哪个流操作

1.      明确源和目的

源:输入流

目的:输出流

2.      操作的数据是否是纯文本

是:字符流

不是:字节流

3.      当体系明确后,再明确要使用哪个具体的对象

通过设备进行区分:

源设备:内存,硬盘,键盘

目的设备:内存,硬盘,控制台

例如:将一个文本中数据存储到另一个文件组。复制文件

分析:

① 源:因为是源,所以使用读取流。InputStream 和Reader

②  操作的数据是否是纯文本:是,所以选用字符流 Reader

因此体系明确

③ 明确对象

明确设备:硬盘

Reader体系中可以操作文件的对象是----FileReader

 

目的:OutputStream 和Writer

是否是纯文本:是,所以选Writer

设备:硬盘,文件---

Writer体系中可以操作文件的对象---FileWriter

             

              最后考虑是否需要提高效率

              是:加入Reader体系中的缓冲区---BufferedReader

                     加入Writer体系中的缓冲区---BufferredWriter

例题2:将一个图片文件中数据存储到另一个文件中。

写好3个明确

1        需求:将键盘录入的数据保存到一个文件中

分析:

源:InputStream和 Reader

是不是纯文本?是,所以用Reader

 

设备:键盘-----对应的对象是System.in

体系是Reader但是System.in对应的是字节流

为了操作键盘的文本数据方便-----所以转成字符流---通过字符串操作

-----So    明确了Reader体系后,将System.in转成Reader

------所以  用Reader体系中的转换流,InputStreamReader

InputStreamReaderisr = new InputStreamReader(System.in);

 

考虑需要提高效率吗?需要------使用缓冲区BufferedReader

BufferedReaderbufr = new BufferedReader(isr);

 

目的:OutputStream和Writer

是否是纯文本?是   选Writer

设备:硬盘文件-------使用FileWriter

FileWriterfw = new Filewriter(“c.txt”);

 

需要提高效率吗? 需要----BufferedWriter

BufferedWritebufw = new BufferedWriter(fw);

 

扩展----------------------------------------------------------------------

想要把录入的数据按照指定的(utf-8)编码表,将数据存到文件中

此时要使用转换流---------OutputStreamWriter


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值