您的位置:首页 > 职场人生

黑马程序员——IO流

2014-09-22 19:36 218 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

IO流

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

2.java对数据的操作是i通过流的方式

3.java用于操作l流的对象都在IO中

4.流按操作数据分两种:字节流和字符流

5.按流向分:输入流、输出流

常用的基类(4个)

字节流的抽象基类:InputStream、OutputStream

字符流的抽象基类;Reader、Writer

既然IO流是操作数据的,那常见的体现形式:文件

字节流



IO异常处理方式

使用try{}catch(){}

对已有数据的续写例子:





Reader

第一种读取方式:



第二种读取方式:





字符流的缓冲区

提高了对数据的读写效率。

对应类:BufferedWriter、BufferedReader

缓冲区结合流才可以使用。在流的基础上对流的功能进行了增强

缓冲区的出现是为了提高流的操作效率而出现的,所以在创建缓冲区之前,必须有流出现。



缓冲区中还提供了一个跨平台换行符:newLine();

BufferedReader

重要方法:

readLine():读一行,当末尾时,返回null。

优点:

便于对文本数据获取,返回时,孩子返回回车前内容不返回任何行终止符

原理:

无论读一行还是读取多个字符,其实最终都是在硬盘上一个一个读取,所以最终使用的还是read方法。

装饰设计模式:

当想要对已有对象进行功能增强是,可以定义一个类将已有对象传入,基于已有对象功能,并提供加强功能,那么自定义的该类就称为装饰类

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

装饰模式比继承灵活,避免了继承体系臃肿情况,降低了类间关系。

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

LineNumberReader就是BufferedReader的装饰类



字符流



字节流缓冲区:BufferedInputStream、BufferedOutputStream



转换流

readLine()是字符流BufferedReader的方法,键盘read是字节流InputStream的方法,将字节流转换成字符流在使用其方法,即为转换流



流操作的基本规律:

三个明确

1.明确源和目的

2.操纵数据是否纯文本

3.体系明确后再明确用对象

通过设备区分:源:内存、硬盘、键盘

目的:内存、硬盘、控制台

提高效率加入缓冲区

扩展

想要把录入数据按指定编码表存数据于文件中,转换流可以指定编码表

记住,转换流什么时候用?

通常涉及字符编码转换时用。

File类

(存在于IO包中)用来将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作。

常见方法:

1.创建:

creatNewFile():返回boolean,在指定位置创建,如果存在不创建

mkdir():返回boolean,常见文件夹一级文件夹

mkdirs():返回boolean,常见多级文件夹

2.删除

delete():返回boolean,

deleteOnExit():返回void,退出时删除指定文件

3.判断

boolean canExecute():是否可执行

boolean exists():文件是否存在

boolean isDirectory():判断目录

boolean isFile():判断文件

boolean isHidden():是否隐藏

boolean isAbsolute():是否抽象文件不存在也判断

4.获取信息

String getName():名字

String getPath():路径

String getParent():父目录:返回绝对路径中的父目录,如果相对路径返回null

String getAbsolutePath():

Long lastmModified():返回最后修改时间

Long  length():文件大小

5.跨平台分隔符:“+File.separator+“

6其他

reNameTo():像剪切

ListRoots():返回根盘

list():返回String,返回目录下文件及文件夹名称(包含隐藏的)。注意:list()的File对象必须是封装了一个目录,目录必须存在

接口FilenameFile:用于过滤

递归

因目录中还有目录,只哟啊使用同一个列出目录功能的函数即可,在列出过程中出现的还是目录的话,还可在此调用本功能也就是函数自己调用自己的,这种方式叫递归。

注意:

1.限定条件

2.注意递归的次数尽量避免内存溢出。



property

是hashtable的子类。有Map集合的特点,里面存储的键值对都是字符串。

是集合与IO技术相结合的集合容器

特点:

可用于键值对形式的配置文件,加载文件时需要固定格式。

setProperty();设置键值对

getProperty():去值

stringPropertyNames()





打印流

PrintWriter、printStream

提供了打印方法,可将各种数据类I型数据原样打印

PrintStream构造函数可以接收的参数类型

1.file对象:File

2.字符串路径:String

3.字节输出流:outputStream

PrintWriter可以接收的参数类型

1.file对象:File

2.字符串路径:String

3.字节输出流:outputStream

4.字符输出流:Writer

序列流:

SequenceInputStream







ObjectOutputStream、ObjectInputStream

序列化
通过实现Serializable接口实现。静态不能被序列化,被transient就是的不能被序列化。

Serialzable接口

1.其中没有方法,称为标记接口。

2.序列化使用的是serialVersionUID的版本号与每个可序列化类相关联,用于验证序列化对象的发送者和接受者是否为同一对象。如果接收者加载的该对象的类的serialVersionUID与对应的发送者的列的版本号不同,则反序列化将会导致InvalidClassException.

声明自己的serialVersionUID格式:

public  static  final  long  SerialVersionUID = 41L;





管道流

PipedInputStream、PipedOutputStream

涉及多线程的IO流技术。







RandomAccessFile

不是IO体系的子类,是Object子类,是IO包成员。

随机访问文件自身能读写,内部封装了byte数组并封装了指针。

getFilePoint():获取指针位置。

seek():没变指针位置。

其实完成读写的原理是内部封装了字节输入流和输出流

通过构造函数可以看出只能操作文件,并且操作文件有模式。

只读r、读写rw,如果模式为“r”不会创建文件会读已存在文件,如果不存在会异常。如果rw,而且该对象的构造函数要操作的文件不存在会自动创建,如果存储不会覆盖。



操作基本数据类型

DataInputStream、DataOUtputStream

用于操作基本数据类型的数据的流对象。

操作字节数组:

ByteArrayInputStream:接收源,源是一个字节数组

ByteArrayOutputStream:不定义目的因为本身就是

没调用底层资源所以不用关流,不抛异常

用流的思想操作数组

操作字符数组:

charArrayWriter、charArrayReader

操作字符串

StringWriter、StringReader
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息