文件
- 什么是文件
文件,对我们并不陌生,文件是保存数据的地方,比如大家经常用的word文档,text文件,excel文件...都是文件。它既可以保存一张图片,也可以保存视频、声音...
- 文件流
文件在程序中是以流的形式来操作的
流:数据在数据源(文件)和程序(内存)之间经历的路径
输入流:数据从数据源(文件)到程序(内存)的路径 输出流:数据从程序(内存)到数据源(文件)的路径
常用的文件操作
- 创建文件对象相关构造器和方法
new Filr(String pathname) // 根据路径构建一个File对象
new Filr(File parent, String child) // 根据父目录文件+子路径构建
new Filr(String parent, String child) // 根据父目录+子路径构建
createNewFile 创建新文件
- 获取文件的相关信息
getName、getAbsolutePath、getParent、length、exists、isFile、isDirectory
- 目录的操作和文件删除
mkdir 创建一级目录、mkdirs创建多级目录、delete删除空目录或文件
java IO流原理
- I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理数据传输。如 读/写文件,网络通讯等
- java程序中,对于数据的输入/输出操作以”流(stream)的方式进行“
- java.io包下提供了各种”流“类和接口,用以获取不同种类的数据,并通过方法数据或者输出数据
流的分类
- 按操作数据单位不同分为:字节流(8bit)二进制,字符流(按字符)
- 按数据流的流向不同分为:输入流、输出流
- 按流的角色的不同分为:节点流,处理流/包装流
| 抽象基类 | 字节流 | 字符流 |
|---|---|---|
| 输入流 | InputStream | Reader |
| 输出流 | OutputStream | Writer |
InputSream:字节输入流
- InputSream抽象类是所有类字节输入流的超类
- 常用子类
- FileInputStream:文件输入流
- BufferedInputStream:缓存字节输入流
- ObjectInputStream:对象字节输入流
FileReader 和FileWriter
- FileReader和FileWriter是字符流,即按照字符来操作IO
- FileReader相关方法:
- new FileReader(File/String)
- read:每次读取单个字符,返回该字符,如果到文件末尾返回-1
- read(char []): 批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾返回-1
- FileWriter常用方法
- new FileWriter(File / String): 覆盖模式,相当于流的指针在首段
- new FileWriter(File/String , true): 追加模式,相当于流的指针在尾端
- write(int):写入单个字符
- write(char[]):写入指定数组
- write(char[], off,len): 写入指定数组的指定部分
- write(String): 写入整个字符串
- weite(String, off,len): 写入字符串的指定部分
- FileWriter使用后,必须要关闭(close)或刷新(flush),否则写入不到指定的文件!
节点流和处理流
- 节点流可以从一个特定的数据源读写数据,如FileReeader、FileWriter
- 处理流(也叫包装流)是”连接“在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,如BufferReader、BufferedWriter
节点流和处理流的区别和联系
- 节点流逝底层流/低级流,直接跟数据源相接
- 处理流包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。
- 处理流(包装流)对节点流进行包装,使用了装饰器设计模式,不会直接与数据源相连。
- 处理流的功能主要体现在以下两个方面
- 性能的提高:主要以增加缓冲的方式来提高输入输出的效率。
- 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便
处理流-BufferedReader和BufferedWriter
- BufferedReader和BufferedWriter属于字符流,是按照字符来读取数据的
- 关闭时,只需关闭外层流即可
对象流 ObjectInputStream和ObjectOutputStream
- 序列化和反序列化
- 序列化就是在保存数据时,保存数据的值和数据类型
- 反序列化就是在恢复数据时,恢复数据的值和数据类型
- 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口:
-
Serializable // 这是一个标记接口,没有方法
-
Externalizable
-
注意事项和细节
- 读写顺序要一致
- 要求实现序列化或反序列化对象,需要实现Serializable
- 序列化的类中建议添加SerivlVersionUID,为了提高版本的兼容性
- 序列化对象时,默认将里面所有属性都进行序列化,但除了Static或transient修饰的成员
- 序列化对象时,要求里面属性的类型也需要实现序列化接口
- 序列化具备可继承性,也就是如果某类已经实现序列化,则它的所有子类也已经默认实现了序列化。
转换流 InputStreamReader 和 OutputStreamWriter
- InputStreamReader: Reader 的子类,可以将InputStream(字节流)包装成Reader(字符流)
- OutputStreamWriter: Writer的子类,实现将OutputStream(字节流)包装成Writer(字符流)
- 当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流
- *可以在使用时指定编码格式(比如utf-8, gbk,gb2312,ISO889-1等)
打印流
- PrintStream 和 PrintWriter
Properties类
- 专门用于读写配置文件的集合类
键=值
- 注意:键值对不需要有空格,值不需要用引号一起来。默认类型是String
- 常用方法
load: 加载配置文件的键值对到properties对象
list: 将数据显示到指定设备 getProperty(key): 根据键获取值 setProperty(key, value): 设置键值对到Properties对象 store: 将Properties中的键值对存贮到配置文件,在IDEA中,保存信息到配置文件,如果含有中文,会储存为unicode码