javaIO流
文件流
文件在程序中是以流的形式来操作的,文件保存在硬盘中,通过输入流被java程序读取,程序再通过输出流输出进文件中。流是数据在数据源和程序之间经历的路径,输入流是数据从数据源到程序的路径,输出流是程序到数据源的路径。
java.io包中提供了各种流类和接口,以获取不同种类的数据,并通过方法输入或输出数据。
流的分类
- 按照数据单位可以分为:字节流(8bit)、字符流
- 按照数据流向分为:输入流、输出流
- 按照流的角色不同分为:节点流、处理流/包装流
常用的文件操作
创建文件对象相关构造器和方法
new File(String pathname)
:根据路径创建文件对象new File(File parent, String child)
:根据父目录文件+子路径构建new File(String parent, String child)
:同上
获取文件相关信息
getName
:获取文件名getAbsolutePath
:获取绝对路径getParent
:获取文件父目录length
:获取文件占用字节exists
:文件是否存在isFile
:是否为文件isDirectory
:是否为文件夹delete
:删除文件mkdir/mkdirs
创建目录/多级目录
常用IO类
InputStream/OutputStream:从文件中读取字节的类,有基本的字节输入输出功能,常使用byte数组进行接收和写入
- 使用
getBytes
将字符串转成Byte数组,从而对文件进行写入 - 使用完输出输入流之后一定要关闭流,可以使用
try-with-resources
语句来确保资源的正确关闭。
- 使用
综合使用示例:
public class Test { |
- Reader/Writer:从文件中读取字符的类,主要用于处理字符数据。
public class Test { |
节点流可以从一个特定的数据源读写数据,如上面使用的FileReader、FileWriter。节点流是底层流,直接与数据源相接。
处理流(包装流)是连接已存在的流,以增加缓冲的方式来提高输入输出的效率,为程序提供更为强大的读写功能,也更加灵活,如BufferedReader、BufferedWritter。处理流既可以消除不同节点流的实现差异,也可以提供方便的方法来完成输入输出。处理流使用了修改器设计模式,不会与数据直接相连。
对象流ObjectInputStream/ObjectOutputStream是用于对象序列化和反序列化的类。它们可以将对象转换为字节流,以便在网络上传输或保存到文件中。
序列化就是在保存数据时,保存数据的值和数据类型
反序列就是在恢复数据时,恢复数据的值和数据类型
如果想让某个对象支持序列化,则其类必须实现Serializable(推荐,该类为标记接口,不需要实现方法)和Externalizable两个接口其中之一
反序列化时,读取的顺序需要和序列化的顺序一致,并且返回的是Object类型,需要向下转型
序列化的类中建议添加
SerialVersionUID
,为了提高版本兼容性序列化对象时,默认里面所有属性都会序列化(所以要求该类中所有的属性必须可序列化),除了
static
或transient
修饰的成员序列化可继承,父类实现了序列化,则其所有子类都可以序列化
示例:
public class Test{ |
标准输入输出流
System.in/System.out
:System.in
编译类型为InputStream,运行类型为BufferedInputStream,输入对象为键盘System.out
编译类型和运行类型均为PrintStream,输出对象为显示器
转换流
InputStreamReader/OutputStreamWriter
:InputStreamReader
:可以将InputStream
包装成Reader
OutputStreamWriter
:可以将OutputStream
包装成Writer
- 可以在使用时指定编码格式
Properties读写文件
在java集合类中介绍过,Properties类是一种专门用于读写配置文件的集合类。在项目过程中经常要从数据库中读文件,读取的文件类型经常是.properties文件。在Properties文件中配置文件的格式为:key=value
,默认格式为String。
常用方法
- load:加载配置文件的键值对到Properties对象
- store:将Properties中的键值对存储到配置文件,在IDEA中,保存时如果有中文,会存储为unicode码
- list:将数据显示到指定设备/流对象
getProperty(key)
:根据键获取值setProperty(key, value)
:设置键值对到Properties对象
public class Test{ |