CoreJava Day15

  • 内存中的数据存储只是临时存储,再次运行程序数据丢失,不能持久化

  • 持久化—>把数据从内存往其他存储设备存储的过程,而数据的传输需要有通道,由此有了流

I / O流

  • 流 —> 内存和其他设备之间传输数据的通道、管道

  • 流的分类

    • 按照方向 —> *** JVM内存***为参照物

      • 输入流 —> 将其他存储设备中的数据读入到JVM内存中
      • 输出流 —> 将JVM内存中的数据写入到其他存储设备中
    • 按照单位

      • 字节流 —> 以字节为操作单位 —> 可以操作所有类型的文件

      • 字符流 —> 以字符为操作单位 —> 只能操作文本文件,即能以记事本打开同时不改变原有内容的文件,如.txt / .java / .c / .html都是文本文件。如 .class / .ppt / .mp4 等都是非文本文件

    • 按照功能

      • 节点流 —> 只具备基本的读写操作
    • 过滤流 —> 在节点流的基础上增强功能

字节流
  • 字节流父类InputStream —> 字节输入流 —> public abstract class InputStream都是抽象类

    • read —> 对应读操作
  • 字节流父类OutputStream —> 字节输出流 —> public abstract class OutputStream都是抽象类

    • write —> 对应写操作
  • 字节节点流

    • FileOutputStream —> 文件节点输出流(文件字节输出流)

    • 常用构造方法

      • FileOutputStream fos = new FileOutputStream(“文件路径 / 文件名”) —> 文件名需要带后缀
      • 绝对路径 —> 盘符:/文件名/文件名/文件.txt 或两个\,有转义字符
      • 相对路径 —> 文件夹 / 文件名.txt —> JVM在当前项目的根目录下查找所指定的文件夹和文件名
      • 如果指定的文件路径中文件不存在,则JVM默认创建一个新文件,但是如果指定文件夹不存在,则运行报错,错误信息为 —> FileNotFoundException(文件找不到异常)
      • 重载:第一个参数代表操作的文件路径及文件名,第二个参数代表是否在原有文件内容基础上进行追加—> true —> 追加,false —> 覆盖,默认为false
    • 常用功能方法

      • public voud write(int n) —> 将单个字节写入到文件中
    • FileInputStream —> 文件字节输入流()

    • 常用构造方法

      • FileInoutStream fis = new FileInputStream(“文件路径 / 文件名”)

      • 参数代表操作的文件路径及文件名

      • 如果指定的文件不存在,则JVM不会默认创建文件,运行报错,错误信息为

        —> FileNotFoundException(文件找不到异常)

    • 常用功能方法

      • public int read(); —> 一次从指定文件中读取一个字节的内容,如果达到文件尾部,返回-1
  • 字节过滤流

    • BufferedOutputStream / BufferedInputStream

      • 缓冲流,提高IO的读写效率,减少访问系统磁盘的次数
      • 利用缓冲输入流进行写操作时,先将内容写入到缓冲区 ( JVM ) 中,利用flush()方法 / close()方法将缓冲区的内容一次性写入到文件中,并清空缓冲区
      • flush() 清空缓冲区,同时将缓冲区内容一次性的写入到文件中,没有关闭流,流可以继续使用
      • close()将流进行关闭,同时close方法底层调用flush方法将缓冲区的内容写入到文件中,此时流被关闭不能再继续使用。
      • 如果缓冲区被不断的写入内容,满时会自动将缓冲区内容一次性写入到文件中,同时清空缓冲区
    • PrintStream

      • 增强了操作八种基本数据类型、String的方法

      • print ( 形参 ) —> 写入不会自动换行

      • println ( 形参 ) —> 写入会自动换行

      • 创建PrintStream对象时,可以直接给定操作的文件路径及文件名 —> PrintStream底层在构造方法中完成字节节点流的创建

        public PrintStream(String fileName) throws FileNotFoundException{
        	this(false , new FileOutputStream(fileName))
        }
        
      • 仅为了方便打印输出各种类型数据信息,没有对应的输入流

    • ObjectOutputStream / ObjectInputStream

      • 增强了操作八种数据类型、字符串等方法

      • writeObject ( Object o) : 将对象写入到文件中

      • Object readObject():从文件中读取一个对象,文件达到尾部则抛出异常

        —> java.io.EOFException

      • 对象序列化

        • 对象在流上进行传输的过程

        • 对象对应的类必须实现 java.io.Serializable 接口 —> 标记接口 ( 空接口 )

          —> 若不实现接口报错:java.io.NotSerializableException(不可序列化异常)

        • 被 transient 修饰的属性不参与序列化,读取时显示默认值

        • 如果自定义类型的属性也参与对象序列化,则该属性对应的类也必须实现java.io.Serializable接口

        • 集合对象也可以参与对象序列化 ( 集合类定义时已经实现java.io.Serializable 接口 ) ,如果集合中存储自定义类型的对象,则对象对应类必须实现 java.io.Serializable 接口

字符流
  • 字符流父类

    • Reader —> 字符输入流,对应读操作

      • FileReader —> 文件字符输入流

      • 构造方法 —> FileReader fr = new FileReader(“文件路径及文件名”); —> 指定文件必须存在,否则运行报错 —> FileNotfoundException(指定文件找不到异常)

      • 常用方法

        —> int read():一次从文件中读取一个字符的内容,将读取的字符内容作为返回值返回,如果达 到文件尾部,返回-1

    • Writer —> 字符输出流,对应写操作

      • FileWriter —> 文件字符输出流

      • 构造方法 —> FileWriter fw = new FileWriter(“文件路径及文件名”); —> 相对路径、绝对路径均 可,若指定文件不存在,JVM默认创建一个新的文件,但是指定的文件夹必须存在,否则报错

        —> FileNotFoundException ( 指定文件找不到异常 )

      • 常用方法

        —> void write(int n):将单个字符写入到文件中

        —> void write(String str):将多个字符写入到文件中

    • 字符过滤流

      • BufferedReader —> 需要字符节点流为基础
        • public String readLine():一次性读取一个文本行内容,读取内容作为返回值返回,如果达到 文件尾部返回null
      • BufferedWriter —> 功能不强大,被PrintWriter取代
      • PrintWriter —> 可以直接指定文件路径及文件名,因为底层做了基础流的封装
        • 增强了八种基本数据类型、字符串、对象类型
        • print(形参):打印不自动换行
        • println(形参):打印自动换行
        • print(Object obj) / println(Object obj):将对象写入到文件中 —> 本质把对象的toString方法的返回值写到文件中,与对象序列化无关
ObjectOutputStream中writeObject(Object o)PrintWriter中print(object o)
将整个对象字节信息写入到文件中,此过程被称为对象序列化;参与对象序列化的对象对应类需要实现java.io.Serializable接口只是将对象toString方法的String返回值写入到文件中,并不是对象序列化,所以参与写操作的对象对应类没有任何要求
桥转换流
  • OutputStreamWriter / InputStreamReader
  • 输出流 / 输入流
    • 字节流和字符流之间转换通道
    • 可以设置编解码格式 —> 使用构造方法即可
    • 桥转换流读写方法通常不用,使用过滤流进行功能加强 —>PrintWriter/BufferedReader 增强读写功能
File 类 —> 位于java.io包中
File 类I O流
区别对文件本身进行设置和操作,如删除文件、更换文件名等
File代表文件或文件夹
直接对文件中内容进行操作,如读文件或写文件内容
  • 常用方法

    • 构造方法

      —> File(String name):指定操作文件的路径及文件名

    • 成员方法

      —> public boolean createNewFile():创建新的文件,成功为true,否则false

      —> public boolean mkdir():创建文件夹,成功为true,否则false

      —> public boolean delete():删除指定的文件或文件夹;文件夹必须为空,文件无限制

      —> ***public String getName()***:获取文件名(含扩展名)

      —> ***public String getAbsolutePath()***:获取文件的绝对路径

      —> boolean exists():判断文件是否存在,存在true,否则false

      —> File[] listFiles():获取指定文件夹中所有文件或文件夹

      —> boolean isDirectory():判断是否为文件夹,是true,反之

      —> boolean isFile():判断是否为文件,是true,反之

I O流异常的处理:
  • 消极处理异常

  • 积极处理异常 —> try catch finally

  • finally中语句不管有没有异常,一定被执行,所以将 I O 流资源释放放于finally中

  • 积极处理异常 —> try with resources —> 自动释放资源

    try(		)//将流对象创建的语句定义此处()内,声明和创建对象需要一起完成
      {	//使用流进行实现业务逻辑
      }catch(异常类型 e){	e.printStackTrack();
    }	//此语法自动完成流资源的释放	
    
  • System系统类,位于java.lang包中

    out是System类中的静态属性,类型为PrintStream

    println()是PrintStream流中方法

常见编码
  • 编码名称不区分大小写
常见编码
ISO8859-1西欧编码
ASCII美国信息编码规范
GBK中国简体,常用
GB2312中国简体,收录中国常用汉字,目前不常用
GB18030中国简体,收录中国所有符号,七万左右
big-5中国繁体,中国台湾使用
UTF-8万国码,底端采用动态编码,中国汉字占2-3字节
  • 编码和解码
    • 编码 —> 将字符对应的十进制转换为二进制的过程
    • 解码 —> 将二进制转换为对应十进制同时显示为对应字符的过程
    • 只有编码和解码方式统一,才不会出现乱码 —> 即编码参照表一致
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值