目录
处理流-BufferedReader 和 BufferedWriter
BufferedIntputStream 和 BufferedOutputStream
对象处理流——ObjectInputStream 和 ObjectOutputStream
转换流(InputStreamReader 和 OutputStreamWriter)
文件
文件的概念
文件就是保存数据的地方。
文件流
文件在程序中是以流的形式来操作的。
类比图:
常用的文件操作
创建文件对象:
new File(String 路径) new File(File 父目录文件 String 子路径构建)
new File(String 父目录文件 String 子路径构建)
创建新文件: createNewFile
获取文件的相关信息:
getName、getAbsoulutePath、getParent、length、exists、isFile、isDirectory
目录的操作:
mkdir: 创建一级目录、mkdirs: 创建多级目录、delete: 删除空目录或文件
IO流原理及流的分类
Java IO流原理
Java程序中,对于数据的输入/输出操作以“流(stream)”的方式进行。
java.io包提供了各种“流”类和接口,用以获取不同种类的数据,并通过方法输入或输出数据。
输入input:读取外部设备到程序中。
输出output:将程序的数据输出到磁盘、光盘等存储设备中。
流的分类
按操作数据单位不同分为:字节流(8 bit)、字符流(按字符,对应几个字节)文本文件。
按数据流的流向不同分为:输入流,输出流。
按流的角色的不同分为:节点流,处理流/包装流。
IO流体系图-常用的类
字节流
FileInputStream: 文件输入流
FileOutputStream:文件输出流
字符流
FileReader:文件输入流
read:每次读取单个字符,返回该字符,如果文件末尾返回-1。
read(char[]):批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾返回-1。
FileWrite:文件输出流
注意 :FileWriter使用后,必须要关闭(close)或刷新(flush),否则写入不到指定的文件。
节点流和处理流
节点流和处理流概念
节点流可以从一个特定的数据源读写数据
处理流(也叫包装流)是连接再已存在的流(节点或处理流)之上,为程序提供更为强大的读写功能,也更加灵活。
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 | 节点流 |
抽象基类 | InputStream | OutputStream | Reader | Writer | |
访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter | |
访问数组 | ByteArrayIntputStream | ByteArrayInputStream | CharArrayReader | CharArrayWriter | |
访问字符串 | StringReader | StringWriter | |||
缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter | 处理流 |
转换流 | InputStreamReader | OutputStreamWriter | |||
抽象基类 | FilterInputStream | FilterOutputStream | FilterReader | FileterWriter | |
打印流 | PrintStream | PrintWriter | |||
推回输入流 | PushbackInputStream | PushbackWriter | |||
特殊流 | DataInputStream | DataOutputStream |
节点流和处理流的区别和联系
- 节点流是底层流/低级流,直接跟数据源相接。
- 处理流(包装类)包装节点流,即可以消除不同节点流的实现差异,也可以提供更方便的方法完成输入输出。
- 处理流(包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连(模拟修饰器设计模式)
处理流-BufferedReader 和 BufferedWriter
处理流 -BufferedReader 和 BufferedWriter 属于字符流,是按照字符来读取数据的
关闭时处理流,只需要关闭外层流即可
BufferedIntputStream 和 BufferedOutputStream
处理流 -BufferedIntputStream 和 BufferedOutputStream 属于字节流,是按照字节来读取数据的
字节流也可以处理字符流
对象处理流——ObjectInputStream 和 ObjectOutputStream
就是能够将基本数据类型或者对象进行序列化 和 反序列化的过程
ObejectInputStream
ObjectOutputStream
序列化和反序列化
- 序列化就是在保存数据时,保存数据的值和数据类型
- 反序列化就是在恢复数据时,恢复数据的值和数据类型
- 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的该类必须实现两个接口之一(Serializable)和(Externalizable)
序列化的注意事项:
- 读取(反序列化)的顺序需要和你保存的顺序一致,否则就要异常。
- 要求序列化或反序化的对象,需要实现Serializable
- 序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性。
- 序列化对象时,默认将里面所有属性都将进行序列化,但除了Static或transient修饰的成员
- 序列化对象时,要求里面属性的类型也需要实现序列化接口
- 序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也默认实现了序列化
SerialVersionUID
private static final long serializable = 1L;
Serializable(可序列化的)
一般实现使用Serializable接口,是一个标记接口;
Externalizable
转换流(InputStreamReader 和 OutputStreamWriter)
com.hspedu.transformation CodeQuestion.java
InputStreamReader类图
OutputStreamWriter类图
转换流的概念
将字节流转换成字符流。
InputStreamReader:Reader的子类,可以将inputStream(字节流)包转成Reader(字符流)
OutputStreamWriter:Writer的子类,实现将OutputStream(字节流)包装成Writer(字符流)
当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文乱码问题,所以建议将字节流转成字符流。
可以在使用时指定编码格式(比如 UTF-8,gbk,gb2312,ISO8859-1等)。
为什么需要转换流?
转换流主要解决什么方便的问题?
打印流
打印流只有输出流没有输入流
PrintStream流的类图
PrintWriter流的类图
Properties(配置文件)
properties底层是hashtable所以方法都是hashtable。
properties常见的方法
load:加载配置文件的键值对到properties对象
list:将数据显示到指定设备
getProperty(key):根据键获取值
setPropery(key,values):设置键值到Properties对象
store:将Properties中的键值对存储到配置文件,在idea中,保存信息到配置文,如果含有中文。会存储为unicode码