您的位置:首页 > 其它

输入输出IO流

2013-03-24 22:47 148 查看
【IO流】

字节流的两个基类

InputStream OutputStream

字符流的两个基类

Reader Writer 

 注:

有这四个类派生出来的子类都是由这四个类作为后缀。

----------【字符流】

【FileWriter】

【FileReader】

【字符流的缓冲区】

BufferedWriter

BufferedReader

缓冲区的出现提高了对数据的读写效率。

缓冲区要结合流才可以使用。

在流的基础上对流的功能进行了增强。

【注意】只要用到缓冲区,就要记得刷新。

【readLine方法原理】

读取字符流缓冲区提供了一个特殊方法,readLIne() 如果到达结尾返回null

【装饰设计模式】

当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供 增强功能。

字节流:

需求:想要操作图片数据,这时就要用到字节流。

字符流其实是一样走的字节,但是他临时存的字节,然后去查表。所以字符流需要刷新动作。

如果直接使用字节流,不定义使用缓冲区,是不需要刷新的。

JVM 默认启动分配内存64M。

初始化一个数组,用作缓存的时候,可以使用fis.aviable();来确定数组的长度。 如果 available();返回的数值太大的话,建议还是使用while循环,不然内存会溢出。

----------【字节流】

字符流操作的也是字节流,只是他们有编码表。

InputStream 

OutputStream

FileInputStream 

FileOutputStream

BufferedInputStream

BufferedOutputStream

【流操作的基本规律:】

最痛苦的就是流对象有很多,不知道改用哪一个。

通过两个明确来完成。

1.明确源和目的。

源:输入流:InputStream Reader

目的:输出流:OutputStream Writer

2、操作的数据是不是纯文本。

是:字符流。

不是:字节流。

3,当体系明确后,在明确要是用哪个具体对象。

通过设备来进行区分:

原设备:内存,硬盘,键盘。

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

扩展:想要把录入的数据按照指定的编码表,将数据存到文件。

自定编码表只有转换流有,OutputStreamWrite。

而该转换流要接受一个字节输出流,而且可以操作文件的字节流:FileOutputStream。

log4j

处理异常日志文件的工具包

----------【File类】

File 类

用来将文件或者文件夹封装成对象。

方便对文件和文件夹的属性信息进行操作。

File对象可以作为参数传递给流的构造函数。

File 常见方法:

1.创建

boolean createNewFie() 在指定的位置创建新的文件,如果该文件已经存在,则不创建,返回false。

和输出流不一样,输出流对象一建立则创建文件,而且文件已经存在,会覆盖。

boolean mkdir():创建文件夹。

boolean mkdirs():创建多级文件夹。

2.删除

boolean delete() 删除失败返回false

void deleteOnExit() 在程序退出时删除指定文件

3、判断

boolean exists(); 文件是否存在.

isFile();

isDirectory()

getPath();

getParent()//该方法返回的是绝对路径中的父目录。如果获取的是相对路径,那么返回的是null。

如果相对路径中有上一层目录,那么该目录就是返回结果。

getAbsolutePath()

lastModified()

length()

----------【递归】

递归要注意:

1、限定条件。

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

问题:删除一个带内容的目录。

删除原理:

在window中,删除目录是从里面往外删除的。

既然是从里往外删除,就需要用到递归。

----------【Properties 类】

表示了一个持久的属性集。

Properties 可保存在流中或从流中加载。

Properties是hashtable的子类,也就是所它具备map集合的特点。而且属性列表中每个键及其对应值都是一个字符串。

是集合和IO技术相结合的集合容器。 

该对象的特点:可以用于键值对形式的配置文件。

那么在加载数据时,需要数据有固定格式。

一个属性列表可包含另一个属性列表作为它的“默认值”;如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表。 

【存储文件格式】

可以为.txt .properties .ini .xml 

【.xml】

格式 用<></>格式表示,可以嵌套

参照org.w3c.dom 接口Document

不过该类比较麻烦

dom4j (dom for java)

----------【打印流:】

PrintStream PrintWriter

【PrintStream】

字节输出流

构造函数接受的参数类型:

1.File 对象File

2.字符串路径String

3.字节输出流OutputStream

【PrintWriter】

字符输出流

构造函数接受的参数类型:

1.File 对象File

2.字符串路径String

3.字节输出流OutputStream

4.字符输出流Writer

----------【序列流:】

可以直接操作输入流和文件。

SequenceInputStream

对多个流进行合并。

----------【操作对象:】

ObjectInputStream  ObjectOutputStream

操作的对象需要实现Serializable(标记接口)

----------【随机读取文件】

RandomAccessFile【重点掌握】

该类不是IO体系中的子类。

而是直接继承自Object。

但是它是IO包中的成员,因为他具备读和写的功能。

内部封装了一个数组,而且通过指针对数组的元素进行操作。

可以通过getFilePointer获取指针位置。

同时可以通过seek改变指针位置。

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

----------【管道流】

PipedInputStream PipedOutputStream

集合中涉及到IO流的 Properties

----------【操作基本数据类型】

DataInputStream  DataOutputStream 

----------【操作字节数组】

ByteArrayInputStream 和ByteArrayOutputStream

用于操作字节数组的流对象。

ByteArrayInputStream:在构造的时候,需要接受数据源,数据源是一个字节数组。

ByteArrayOutputStream:在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组。

因为这两个流对象都操作的数组,并没有使用系统资源。

所以,不用进行close关闭。

在原操作规律讲解时:

源设备:

键盘System.in,硬盘FileStream,内存ArrayStream;

目的设备:

控制台System.out,硬盘FileStream,内存ArrayStream。

用流的读写思想来操作数组

----------【操作字符数组】

CharArrayInputStream和CharArrayOutputStream

----------【操作字符串】

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