Java IO流

146 阅读5分钟

文件

  • 什么是文件

文件,对我们并不陌生,文件是保存数据的地方,比如大家经常用的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)二进制,字符流(按字符)
  • 按数据流的流向不同分为:输入流、输出流
  • 按流的角色的不同分为:节点流,处理流/包装流
抽象基类字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter

InputSream:字节输入流

  • InputSream抽象类是所有类字节输入流的超类
  • 常用子类
  1. FileInputStream:文件输入流
  2. BufferedInputStream:缓存字节输入流
  3. ObjectInputStream:对象字节输入流

FileReader 和FileWriter

  • FileReader和FileWriter是字符流,即按照字符来操作IO
  • FileReader相关方法:
  1. new FileReader(File/String)
  2. read:每次读取单个字符,返回该字符,如果到文件末尾返回-1
  3. read(char []): 批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾返回-1
  • FileWriter常用方法
  1. new FileWriter(File / String): 覆盖模式,相当于流的指针在首段
  2. new FileWriter(File/String , true): 追加模式,相当于流的指针在尾端
  3. write(int):写入单个字符
  4. write(char[]):写入指定数组
  5. write(char[], off,len): 写入指定数组的指定部分
  6. write(String): 写入整个字符串
  7. weite(String, off,len): 写入字符串的指定部分
  • FileWriter使用后,必须要关闭(close)或刷新(flush),否则写入不到指定的文件!

节点流和处理流

  • 节点流可以从一个特定的数据源读写数据,如FileReeader、FileWriter
  • 处理流(也叫包装流)是”连接“在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,如BufferReader、BufferedWriter

节点流和处理流的区别和联系

  1. 节点流逝底层流/低级流,直接跟数据源相接
  2. 处理流包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。
  3. 处理流(包装流)对节点流进行包装,使用了装饰器设计模式,不会直接与数据源相连。
  • 处理流的功能主要体现在以下两个方面
  1. 性能的提高:主要以增加缓冲的方式来提高输入输出的效率。
  2. 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便

处理流-BufferedReader和BufferedWriter

  • BufferedReader和BufferedWriter属于字符流,是按照字符来读取数据的
  • 关闭时,只需关闭外层流即可

对象流 ObjectInputStream和ObjectOutputStream

  • 序列化和反序列化
  1. 序列化就是在保存数据时,保存数据的值和数据类型
  2. 反序列化就是在恢复数据时,恢复数据的值和数据类型
  3. 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口:
    • Serializable // 这是一个标记接口,没有方法

    • Externalizable

注意事项和细节

  1. 读写顺序要一致
  2. 要求实现序列化或反序列化对象,需要实现Serializable
  3. 序列化的类中建议添加SerivlVersionUID,为了提高版本的兼容性
  4. 序列化对象时,默认将里面所有属性都进行序列化,但除了Static或transient修饰的成员
  5. 序列化对象时,要求里面属性的类型也需要实现序列化接口
  6. 序列化具备可继承性,也就是如果某类已经实现序列化,则它的所有子类也已经默认实现了序列化。

转换流 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码