Java进阶:File类、IO流

活动地址:CSDN21天学习挑战赛

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。

File类

File类概述

  1. File类的对象代表操作系统的文件(文件、文件夹),File类在java.io.File包下
  2. File类提供了诸如:创建文件对象代表文件,获取文件信息(大小、修改时间)、删除文件、创建文件(文件夹)等功能

File类创建对象

方法名称说明
public File (String pathName)根据文件路劲创建文件对象
public File (String parent,String child)根据父路径名字字符串和子路径名字字符串创建文件对象
public File(File parent,String child)根据父路径对应文件对象和子路径名字字符串创建文件对象
  • File对象可以定位文件和文件夹
  • File封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以是不存在的
  • 绝对路径和相对路径
    • 绝对路径是带盘符的
    • 相对路径是不带盘符的,默认到当前工程下寻找文件

常用方法:判断文件类型、获取文件信息

方法名称说明
public boolean isDirectory()判断此路径名表示的File是否为文件夹
public boolean isFile()判断此路径名表示的File是否为文件
public boolean exists()判断此路径名表示的File是否存在
public long length()返回文件的大小(字节数)
public String getAbsolutePath()返回文件的绝对路径
public String getPath()返回定义文件时使用的路径
public String getName()返回文件的名称,带后缀
public long lastModified()返回文件的最后修改时间(时间毫秒值)

常用方法:创建文件、删除文件

  1. File类创建文件
方法名称说明
public boolean createNewFile()创建一个新的空的文件
public boolean mkdir()只能创建一级文件夹
public boolean mkdirs()可以创建多级文件夹
  1. File类删除文件
方法名称说明
public boolean delete()删除由此抽象路径名表示的文件或者空文件夹

delete方法默认只能删除文件和空的文件夹,不能删除非空文件夹,delete方法直接删除不走回收站

常用方法:遍历文件夹

方法名称说明
public String[] list()获取当前目录下所有的“一级文件名称”到一个字符串数组中去返回
public File[] listFiles()获取当前目录下所有的“一级文件对象”到一个文件对象数组中去返回(常用 重点
  • listFiles方法注意事项:
    • 当文件不存在时或者代表文件时,返回null
    • 当文件对象代表一个空文件夹时,返回一个长度为0的数组
    • 当文件对象是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
    • 当文件对象是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
    • 当没有权限访问该文件夹时,返回null

IO流:概述

IO结构

概述

  1. I表示intput,把硬盘文件中的数据读入到内存的过程,称之输入,负责读
  2. O表示output,把内存中的数据写出到硬盘文件的过程,称之输出,负责写

IO流示意图

IO流的分类

  • 按流的方向分
    按流的方向

  • 按流中的数据最小单位分
    按数据最小单位

  • 总结流的四大类:

    • 字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流称为字节输入流。字节输入流 InputStream(读字节数据的)
    • 字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流称为字节输出流。字节输出流 OutoutStream(写字节数据出去的)
    • 字符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流称为字符输入流。字符输入流 Reader(读字符数据的)
    • 字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流称为字符输出流。==字符输出流 Writer(写字符数据出去的)
      ==

    流分类示意图

IO流:字节流

字节流

字节输入流:每次读取一个字节

  • 文件字节输入流:FileInputStream
  • 以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去
构造器说明
public FileInputStream​(File file)创建字节输入流管道与源文件对象接通
public FileInputStream​(String pathname)创建字节输入流管道与源文件路径接通
方法名称说明
public int read()每次读取一个字节返回,如果字节已经没有可读的返回-1
public int read(byte[] buffer)每次读取一个字节数组返回,如果字节已经没有可读的返回-1

每次读取一个字节存在性能较慢,读取中文字符输出无法避免乱码问题

FileInputStream

字节输入流:每次读取一个字节数组

  • 文件字节输入流:FileInputStream
  • 以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去
方法名称说明
public int read()每次读取一个字节返回,如果字节已经没有可读的返回-1
public int read(byte[] buffer)每次读取一个字节数组返回,如果字节已经没有可读的返回-1

每次读取一个字节数组时读取的性能得到了提升,但读取中文字符输出仍无法避免乱码问题

读取字节数组

字节输入流:读取文件的全部字节

  • 方式一: 自己定义一个字节数组与文件的大小一样大,然后使用读取字节数组的方法,一次性读取完成

如果文件过大,字节数组可能引起内存溢出

方法名称说明
public int read(byte[] buffer)每次读取一个字节数组返回,如果字节已经没有可读的返回-1
  • 方式二: 官方为字节输入流InputStream提供了如下API可以直接把文件的全部数据读取到一个字节数组中
方法名称说明
public byte[] readAllBytes() throws IOException直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回

字节输出流:写字节数据到文件

写字节数据到文件

  1. 文件字节输出流:FileOutputStream
    • 以内存为基准,把内存中的数据以字节的形式写出到磁盘文件中去的流
构造器说明
public FileOutputStream​(File file)创建字节输出流管道与源文件对象接通
public FileOutputStream​(File file,boolean append)创建字节输出流管道与源文件对象接通,可追加数据
public FileOutputStream​(String filepath)创建字节输出流管道与源文件路径接通
public FileOutputStream​(String filepath,boolean append)创建字节输出流管道与源文件路径接通,可追加数据
  1. 文件字节输出流(FileOutputStream)写数据出去的API
方法名称说明
public void write(int a)写一个字节出去
public void write(byte[] buffer)写一个字节数组出去
public void write(byte[] buffer , int pos , int len)写一个字节数组的一部分出去
  1. 流的关闭与刷新API
方法名称说明
flush()刷新流,还可以继续写数据
close()关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据

文件拷贝

文件拷贝

IO流:资源释放的方式

try-catch-finally

  1. finally放在try-catch后面的,无论是正常执行还是异常执行代码,最后一定要执行,除非JVM退出

  2. 作用:一般用于进行最后的资源释放操作(专业级做法

  3. try-catch-finally格式

    try {
        FileOutputStream fos = new 	FileOutputStream("a.txt");
        fos.write(97); 
    } catch (IOException e) {
    	e.printStackTrace();
    } finally {
    }
    

try-with-resource

  1. finally虽然可以用于释放资源,但是释放资源的代码过于繁琐,需要简化
InputStream is = null ;
OutputStream os = null;
try{
    ...
}catch (Exception e){
    e.printStackTrace();
} finally {
    // 关闭资源!
    try {
         if(os != null) os.close();
    } catch (Exception e) {
         e.printStackTrace();
    }
     try {
         if(is != null) is.close();
     } catch (Exception e) {
         e.printStackTrace();
      }
}
  1. JDK 7和JDK9中都简化了资源释放操作
    • 基本做法
    try{
        可能出现异常的代码;
    }catch(异常类名 变量名){
        异常的处理代码;     
    }finally{
         执行所有资源释放操作;
    }
           ==手动释放资源==
    
    • JDK7改进方案:
    try(定义流对象){
    	可能出现异常的代码;
    }catch(异常类名 变量名){
    	异常的处理代码;
    } 
    
    	== 资源用完最终自动释放==
    
    • JDK9改进方案:
    定义输入流对象;
    定义输出流对象;
    try(输入流对象;输出流对象){
    	可能出现异常的代码;
    }catch(异常类名 变量名){
    	异常的处理代码;
    } 
    
    	== 资源用完最终自动释放==
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

√沫影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值