输入输出IO流

来源:互联网 发布:淘宝店怎么装修免费 编辑:程序博客网 时间:2024/05/23 05:07



【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



原创粉丝点击