Java中常见的IO流及使用方法

IO的概念及分类

什么是流

就是内存和存储设备之间传输数据的通道或是管道

分类

按照方向 [以JVM内存为参照物]
  • 输入流
    将<存储设备>中数据读取到< jvm内存>中->读操作(read)
  • 输出流
    将< jvm内存>中数据写入到< 存储设备>中->写操作(write)
按照单位:
  • 字节流
    以字节为单位,可以操作任意类型的文件
  • 字符流
    以字符为单位,可以操作文本类型的文件
    注意:文本类型的文件:能以 记事本打开而且不乱码的文件,例如:.java / .txt / .c / .html 等文件都是文本文件,.class / .world / .ppt / .map4 等是非文本文件
按照功能:
  • 节点流
    只具有基本的读写功能
  • 过滤流
    在节点流的基础上增强功能

字节流

字节流父类(抽象类)

InputStream

字节输入流,对应的读操作(read)

OutputStream

字节输出流,对应的操作写操作(write)

字节节点流

FileOutputStream:文件字节输出流

常见的构造方法

  • FileOutputStream fos = new FileOutputStream(“E:/test/a.txt”);
    • 如果指定文件不存在,则JVM会自动的创建文件,但是如果指定文件夹不存在,则jvm报错,错误信息为: java.io.FileNotFoundException: (系统找不到指定的路径)
    • 绝对路径
      带有盘符的路径,盘符:/文件夹/文件
  • FileOutputStream fos = new FileOutputStream(“a.txt”);
    • 相对路径:默认在当前项目的根目录下查找所需要的的文件,如果有,直接使用,如果没有则jvm自动创建此文件
  • FileOutputStream fos = new FileOutputStream(“file/a.txt”);
    • 开发时,通常在项目的根目录下创建一个文件夹,用于存 储项目中操作的文件,便于管理
  • FileOutputStream fos = new FileOutputStream(“file/a.txt”,true);
    • 参数说明
      第一个参数:指定操作的文件路径及文件名
      第二个参数:boolean,是否在原有内容进行追加
      true - 不覆盖原有内容,直接追加,false - 覆盖原有内容

常用方法

  • void write(int n):将一个字节的内容写入到文件中
FileInputStream:文件字节输入流

常用构造方法

  • FileInputStream fis = new FileInputStream(“E:\Java2003\a.txt”);
    • 参数代表
      操作文件的路径及文件名,指定的文件夹及文件 必须存在,否则运行报错,报错信息为:java.io.FileNotFoundException: (系统找不到指定的文件)

常用的方法
int read():一次性读取一个字节的内容,读取到的内容作为 返回值返回,如果达到文件的尾部,则返回-1

字节过滤流

BufferedOutputStream/Bu fferedInputStream
  • 缓冲流,提高IO的读写效率,减少访问磁盘次数
  • 数据存储存储在缓冲区,可以通过flush方法或是close方法将缓冲区内容一次性写入到文件中,并清空缓冲区
  1. flush方法只是清空缓冲同将缓冲区的内容一次性写入到文件中,但是流还是继续可以使用;
  2. close方法关闭流的同时清空缓冲区,将缓冲区的内容一次性的写入到文件中,流一旦关闭不能再继续使用
    注意:缓冲满的时候,将缓冲区的内容一次性写入到文件 中,同时清空缓冲区
PrintStream (输出流)
  • 缓冲流,提高IO的写的效率
  • 增强了操作基本数据类型的方法,同时还可以操作字符串 print(int n) / print(long l) / print(boolean b) / print(double d) / print(String str) —> 不自动换行
    println(int n) / println(long l) / println(boolean b) / println(double d) / println(String str) --> 自动换行
ObjectOutputStream / ObjectInputStream(过滤流)
  • 增强缓冲区,提高IO读写效率
  • 增强了操作8中基本数据类型方法
  • 对象序列化
  1. 概念
    对象放在流上进行传输的过程
  2. 参与对象序列化的要求
    参与对象序列化的对象对应的类必须实现 java.io.Serializable接口
  3. 对象的读写操作
    void writeObject(Object obj):将指定的对象写入到文件
    Object readObject() :从文件中读取对象
  4. 文件达到尾部的标记
    java.io.EOFException
  5. 如果对象的某一个属性不想参与对象序列化,则属性前面用transient修饰
  6. 如果参与对象序列的对象中有自定类型的属性,该属性也必须实现 java.io.Serializable 接口,否则运行报错,错误信息为:java.io.NotSerializableException(不可序列化的异常)
  7. 如果参与对象序列化的是集合对象,集合对应类在JDK提供时已经实现java.io.Serializable 接口,但是如果集合中存储的是自定义类型的对象,则该对应对应类必须实现 java.io.Serializable接口

常见编码方式

  • 常见的编码
    ASCII码值表
    美国制定的第一个标准表,每一个标准表的前 0~255都是此标准内容
    ISO8859-1
    西欧编码,底层占用一个字节内容
    GB2312
    最早的中国汉字编码表,6000多汉字
    GBK
    目前主流的中国汉字编码表,2万多汉字
    GB18030
    汉字的编码表,7万多的中国符号
    Big5
    中国繁体字,中国台湾应用
    UTF-8
    万国码, 在UTF-8中底层采用是动态编码,汉字占用2~3字节
    注意:编码方式的书写不区分大小写,utf-8等价于UTF-8
  • 编码和解码
    编码:将字符对应十进制转换为二进制的过程
    解码:将进制转换为十进制对应为字符的过程
    注意:只有当编码方式和解码方式统一,才不会出现乱码

字符流

字符流的父类

  • Reader
    字符输入流 [对应的读操作 - read]
  • Writer
    字符输出流 [对应的写操作 - write]

节点流

FileWriter:文件字符输出流
  • 常用方法
    void write(int n):将单个字符写入到文件
    void write(String str):将一个字符串写入到文件中
FileReader:文件字符输入流
  • 常用方法
    int read():一次性读取单个字符内容,读取的内容作为返回值返回,如果达到文件的尾部,则返回-1

过滤流

BufferedReader

String readLine():一次性的读取一个文本行的内容,返回值类型为String,如果达到文件尾部则返回null.

PrintWriter:
  • 可以操作8种基本数据和字符串
    print(形参列表):将对应数据写入到文件中,不换行
    println(形参列表):将对应的数据写入到文件中,自动换行
  • 可以将对象对应内容写入文件中
    println(Object obj) :将对象的toString方法的返回值写入到 文件中

桥转换流

InputStreamReader / OutputStreamWriter
  • 作用
    字节流转换为字符流的通道,可以设置编解码的方式
  • 步骤总结
    需要设置编解码格式的时候,需要应用到桥转换流
  1. 创建文件字节流作为基础流:
    FileInputStream/FileOutputStream
  2. 创桥转换流:
    将字节流转换字符流,同时可以设置编解码格式InputStreamReader / OutputStreamWriter
  3. 包装过滤流,目的:增强字符流的读写功能 BufferedReader/PrintWriter
  4. 读写操作
  5. 关闭流,关闭最层即可

File类

File 和 IO流的区别

  • IO流:对文件的内容直接操作,读文件或是往文件中写入内容
  • File:代表一个文件或是文件夹(目录),利用File类中的一些方法对文件或是文件夹进行操作

常用的方法

  • 构造方法
    public File(String name):操作文件或是文件夹的路径及名字
  • 成员方法
方法名 含义
boolean createNewFile() 创建一个新的文件,成功- true;不成功-false(文件已经存在)
boolean mkdir() 创建一个新的文件夹
boolean delete() 删除一个文件或是文件夹,如果删除文件夹,文件夹为空,删除成功;文件夹不为空, 删除失败,如果删除文件,不管文件中是否存在内容,删除成功
String getName() 获取文件名,带有后缀(文件类型,扩展名) a.txt;同时还可以获取文件夹的名字
String getAbsolutePath() 获取绝对路径
boolean exists() 判断一个文件或是文件夹是否存在, 存在-true;不存在-false
File[] listFiles() 获取文件夹中所有为文件夹和文件
boolean isFile() 判断指定的是否为文件,是-true;不 是-false
boolean isDirectory() 判断指定的是文件夹,是-true; 不是-false

整理不易,喜欢请点个赞!
编者微信:1014961803,添加时请备注"CSDN"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章