【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