3.3 Java之文件与I/O流(文件字节流)


I/O流导览

重点

重点:文件流(四个),缓冲流(四个)

  • 文件流
    FileInputStream / FileOutputStream / FileReader / FileWriter
  • 缓冲流
    BufferedInputStream / BufferedOutputStream /
    BufferedReader / BufferedWriter

补充

  • 程序运行,JVM在内存中分配资源,执行完后回收资源(在内存中操作),断电则消失
  • 以流的形式输入输出,有最基本的处理单位

  • 集合有不同的实现类来处理不同的对象,类似,不同I/O流处理不同数据类型

  • 随机存取文件流:既能输入,也能输出


File类概述

这里写图片描述

  • file一定对应物理文件的路径,称为pathname(物理文件的地址),通过String类型指明,指明后创建类的对象
  • 出于跨平台性的考虑,路径书写采用两个\或/
  • 当前文件目录下指的是当前工程
  • file可表示文件或文件夹,可不存在
  • 将文件或文件夹表示成Java中的对象,操作对象即操作对象对应的文件,
  • 跨平台,指的是只要文件存在,生成的file对象可在不同的平台上运行

File类方法

这里写图片描述

访问文件名方法

这里写图片描述

  • 绝对的文件名的显示要加上绝对路径,因为本身文件就是绝对路径表示的,所以一致
  • getParent():获取上一层的文件目录
  • 绝对的文件路径:还是包括绝对路径内容在内的,因为本身文件就是绝对路径表示的

这里写图片描述

  • 要求一个存在,一个不存在
  • 要求同类型(文件对文件,文件目录对目录)
  • 跨盘符不行,C盘文件变不成D盘文件
  • 文件变迁位置的方法

文件检测方法

这里写图片描述

这里写图片描述

  • 文件存在与否
  • 能写,能读
  • 是文件与否,是目录与否
  • 最后一次修改时间,long型返回值(传入Date类构造器返回时间)
  • 文件长度,long型返回值
  • 上方(file1)为文件操作,下方(file2)为目录操作

文件与目录操作方法

这里写图片描述


这里写图片描述

这里写图片描述

  • 创建文件/目录过程存在异常,要处理
  • 返回值为布尔类型,表示操作成功与否
  • mkdirs应用场景:上层目录也不存在,则均创建
  • list方法仅返回文件名
  • listFiles方法返回文件对象,可进行相应操作

I/O流概述

  • I/O流就是用来处理数据传输,即传输数据的叫数据流,数据流 以I/O两种形式呈现

  • 程序在内存中分配空间从而运行的

  • 站在程序的视角,看输入输出

I/O流分类

这里写图片描述

  • 按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)

    • 字符流:文本文件
    • 字节流:音视频文件,图片,以字节形式或以二进制流的形式传输数据(二进制流本质上里面也是一个个字节的形式)
  • 按数据流的流向不同分为:输入流,输出流

  • 按流的角色的不同分为:节点流,处理流

    1. 节点流或称文件流(共4个):程序通过该流直接与文件交互
    2. 处理流:包裹节点流的流,如缓冲流:加速节点流数据传输,处理已有的节点流(立足于节点流)或者包裹处理流的处理流

I/O类体系框架

这里写图片描述

这里写图片描述

  • 抽象基类派生40多个流
  • 转换流:字节与字符的转换
  • 对象流只有字节形式,因为对象都以字节形式出现
  • 打印流:打印,即只有输出
  • 除了文件流是节点流外,其他都是处理流

文件流

这里写图片描述


InputStream

version1

这里写图片描述
这里写图片描述

  • 读取一定要存在,写入可不存在(不存在则创建,存在则覆盖)
  • read():
    • 从输入流的数据中读一个字节值,以字节为单位读
    • 返回值类型:返回数据的下一个字节值(返回值若不是-1,则将数据流的下一个byte读出来)

以字节为单位读取的方法可简写为
这里写图片描述

  • version1存在问题:
    • 流的资源不是JVM的内存资源,不会自动回收,但其比较占用内存,需要显式关闭
    • 异常处理不彻底,若throws处理,出现异常,read处抛出异常对象,直接退出,未关闭流,而流一定要关闭,则throws改为try/catch块

try/catch块自动产生
这里写图片描述


version2

这里写图片描述
这里写图片描述

  • 直接print(b),相当于将char类型(读取的文件内容是英文字符)转化为int型,需要强转回来,则print((char)b)

  • version2存在问题:以byte为单位读取非英文字母内容的文件时有BUG(汉字char,两个字节)


version3

这里写图片描述

修改处
- 加if语句,避免fis空指针异常
- 遍历的是len的长度,length与len不同,len表示每次读入的字节长度,而length固定为5
- 通过String类的构造器,将字节数组转化为字符串,然后打印,或者采用for循环进行打印


辨析:
背景:文件内容为abcdefg

这里写图片描述
若为len,则打印正确,若为下图的length,则为abcdefgcde


OutputStream

节点流的特点:直接和文件交互,将文件对象作为形参传入流的构造器
这里写图片描述
这里写图片描述

  • 输入流对象声明写在外部,便于处理异常
  • write方法形参:先写成字符串形式,再转化为字节数组,即向文件写入字节数组
  • 文件的位置以形参的形式呈现,File对象对应于字符串表示的物理文件

文件流应用(文件复制)

这里写图片描述
这里写图片描述

  • 注意两种错误写法,这两种写法等效
  • 关闭输入输出流,可并列写,但若fos的catch块里面再抛出某异常对象,则要将fis的关闭写在finally块里(确保流都能关闭)
  • 接收的字节数组的大小有最优值,此处为20,但实际中太大太小都不好
  • 运行复制程序,F5刷新,查看结果

封装文件复制方法

这里写图片描述

  • 传入的形参为文件位置

测试复制方法

这里写图片描述

猜你喜欢

转载自blog.csdn.net/lwz45698752/article/details/81531138
3.3