09_常用类_文件

File

创建对象定位文件,可以删除、获取文件信息等,但是不能读写文件内容。

创建

方法名称 说明
public File(String pathname) 根据文件路径创建文件对象
public File(String parent, String child) 根据父路径名字符串和子路径名字符串创建文件对象
public File(File parent, String child) 根据父路径对应文件对象和子路径名字符串创建文件对象
  • File对象可以定位文件和文件夹
  • File封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以是不存在的
    • 绝对路径:File file1 = new File("D:\itheima\a.txt")
    • 相对路径:File file3 = new File("模块名\a.txt")

常用方法

获取文件信息:

方法名称 说明
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() 返回文件的最后修改时间(时间毫秒值)

创建:

方法名称 说明
public boolean createNewFile() 创建一个新的空的文件
public boolean mkdir() 只能创建一级文件夹
public boolean mkdirs() 可以创建多级文件夹

删除:

方法名称 说明
public boolean delete() 删除由此抽象路径名表示的文件或空文件夹

遍历:

方法名称 说明
public String[] list() 获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回。
public File[] listFiles()(常用) 获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回(重点)

listFiles用法注意:

  • 当文件不存在时或者代表文件时,返回null
  • 当文件对象代表一个空文件夹时,返回一个长度为0的数组
  • 当文件对象是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
  • 当文件对象是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
  • 当没有权限访问该文件夹时,返回null

IO

概述

I表示intput,把硬盘文件中的数据读入到内存的过程,称之输入,负责读。

O表示output,把内存中的数据写出到硬盘文件的过程,称之输出,负责写。

分类

按流向分:

  • 输入流
  • 输出流

按流数据最小单位:

  • 字节流:可操作所有类型的文件,包括音频视频图片等
  • 字符流:只能操作纯文本文件

体系

image-20230401165736363

字节流

FileInputStream

以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。

创建:

构造器 说明
public FileInputStream(File file) 创建字节输入流管道与源文件对象接通
public FileInputStream(String pathname) 创建字节输入流管道与源文件路径接通

读取:

方法名称 说明
public int read() 每次读取一个字节返回,如果字节已经没有可读的返回-1
public int read(byte[] buffer) 每次读取一个字节数组返回,如果字节已经没有可读的返回-1
public byte[] readAllBytes() 直接将对应的文件对象的字节数据装到一个字节数组返回,可能会OOM

FileOutputStream

以内存为基准,把内存中的数据以字节的形式写出到磁盘文件中去的流

创建:

构造器 说明
public FileOutputStream(File file) 创建字节输出流管道与源文件对象接通
public FileOutputStream(File file,boolean append) 创建字节输出流管道与源文件对象接通,可追加数据
public FileOutputStream(String filepath) 创建字节输出流管道与源文件路径接通
public FileOutputStream(String filepath,boolean append) 创建字节输出流管道与源文件路径接通,可追加数据

写出:

方法名称 说明
public void write(int a) 写一个字节出去
public void write(byte[] buffer) 写一个字节数组出去
public void write(byte[] buffer , int pos , int len) 写一个字节数组的一部分出去。

刷新与关闭:

方法 说明
flush() 刷新流,还可以继续写数据
close() 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据

资源释放

资源都是实现了Closeable/AutoCloseable接口的类对象。

public abstract class InputStream implements Closeable {}

public abstract class OutputStream implements Closeable, Flushable{} 

try-catch-finally

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

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

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();
    }
}

try-with-resource

JDK7改进方案:

try(定义流对象){
        可能出现异常的代码;
}catch(异常类名 变量名){
        异常的处理代码;
} 

JDK9改进方案:

定义输入流对象;
定义输出流对象;
try(输入流对象;输出流对象){
        可能出现异常的代码;
}catch(异常类名 变量名){
        异常的处理代码;
} 

字符流

FileReader

以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去。

创建:

构造器 说明
public FileReader(File file) 创建字符输入流管道与源文件对象接通
public FileReader(String pathname) 创建字符输入流管道与源文件路径接通

读取:

方法名称 说明
public int read() 每次读取一个字符返回,如果字符已经没有可读的返回-1
public int read(char[] buffer) 每次读取一个字符数组,返回读取的字符个数,如果字符已经没有可读的返回-1

FileWriter

以内存为基准,把内存中的数据以字符的形式写出到磁盘文件中去的流。

创建:

构造器 说明
public FileWriter(File file) 创建字符输出流管道与源文件对象接通
public FileWriter(File file,boolean append) 创建字符输出流管道与源文件对象接通,可追加数据
public FileWriter(String filepath) 创建字符输出流管道与源文件路径接通
public FileWriter(String filepath,boolean append) 创建字符输出流管道与源文件路径接通,可追加数据

写出:

方法名称 说明
void write(int c) 写一个字符
void write(char[] cbuf) 写入一个字符数组
void write(char[] cbuf, int off, int len) 写入字符数组的一部分
void write(String str) 写一个字符串
void write(String str, int off, int len) 写一个字符串的一部分

刷新与关闭:

方法 说明
flush() 刷新流,还可以继续写数据
close() 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据

缓冲流

概述

image-20230401171858722

缓冲流也称为高效流、或者高级流。之前学习的字节流/字符流可以称为原始流。

作用:缓冲流自带缓冲区,可以提高原始字节流、字符流读写数据的性能

字节缓冲流

字节缓冲输入流:BufferedInputStream,提高字节输入流读取数据的性能。

字节缓冲输出流:BufferedOutputStream,提高字节输出流读取数据的性能。

构造器 说明
public BufferedInputStream(InputStream is) 可以把低级的字节输入流包装成一个高级的缓冲字节输入流管道,从而提高字节输入流读数据的性能
public BufferedOutputStream(OutputStream os) 可以把低级的字节输出流包装成一个高级的缓冲字节输出流,从而提高写数据的性能

字符缓冲流

字符缓冲输入流:BufferedReader。

提高字符输入流读取数据的性能,除此之外多了按照行读取数据的功能。

构造器/方法 说明
public BufferedReader(Reader r) 可以把低级的字符输入流包装成一个高级的缓冲字符输入流管道,从而提高字符输入流读数据的性能
public String readLine() 读取一行数据返回,如果读取没有完毕,无行可读返回null

字符缓冲输出流:BufferedWriter。

提高字符输出流写取数据的性能,除此之外多了换行功能。

构造器/方法 说明
public BufferedWriter(Writer w) 可以把低级的字符输出流包装成一个高级的缓冲字符输出流管道,从而提高字符输出流写数据的性能
public void newLine() 换行操作

转换流

概述

如果代码编码和文件编码不一致,使用字符流直接读取会乱码。

如果如何解决呢?

  • 使用字符输入转换流
  • 可以提取文件的原始字节流,然后把字节流以指定编码转换成字符输入流,这样字符输入流中的字符就不乱码了
image-20230401172547920

字符输入转换流

字符输入转换流:InputStreamReader,可以把原始的字节流按照指定编码转换成字符输入流。

构造器 说明
public InputStreamReader(InputStream is) 可以把原始的字节流按照代码默认编码转换成字符输入流。几乎不用,与默认的FileReader一样。
public InputStreamReader(InputStream is ,String charset) 可以把原始的字节流按照指定编码转换成字符输入流,这样字符流中的字符就不乱码了(重点)

字符输出转换流

字符输出转换流:OutputStreamWriter,可以把字节输出流按照指定编码转换成字符输出流。

构造器 说明
public OutputStreamWriter(OutputStream os) 可以把原始的字节输出流按照代码默认编码转换成字符输出流。几乎不用。
public OutputStreamWriter(OutputStream os,String charset) 可以把原始的字节输出流按照指定编码转换成字符输出流(重点)

对象序列化

对象序列化:以内存为基准,把内存中的对象存储到磁盘文件中。

使用到的流是对象字节输出流:ObjectOutputStream。

创建:

构造器 说明
public ObjectOutputStream(OutputStream out) 把低级字节输出流包装成高级的对象字节输出流

方法:

方法名称 说明
public final void writeObject(Object obj) 把对象写出去到对象序列化流的文件中去

对象反序列化:以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象。

构造器 说明
public ObjectInputStream(InputStream out) 把低级字节输如流包装成高级的对象字节输入流

方法:

方法名称 说明
public Object readObject() 把存储到磁盘文件中去的对象数据恢复成内存中的对象返回

打印流

image-20230401173118283

打印流可以实现方便、高效的打印数据到文件中去。打印流一般是指:PrintStream,PrintWriter两个类。

可以实现打印什么数据就是什么数据,例如打印整数97写出去就是97,打印boolean的true,写出去就是true。

PrintStream创建:

构造器 说明
public PrintStream(OutputStream os) 打印流直接通向字节输出流管道
public PrintStream(File f) 打印流直接通向文件对象
public PrintStream(String filepath) 打印流直接通向文件路径

方法:

方法 说明
public void print(Xxx xx) 打印任意类型的数据出去

PrintWriter:

构造器 说明
public PrintWriter(OutputStream os) 打印流直接通向字节输出流管道
public PrintWriter (Writer w) 打印流直接通向字符输出流管道
public PrintWriter (File f) 打印流直接通向文件对象
public PrintWriter (String filepath) 打印流直接通向文件路径

方法:

方法 说明
public void print(Xxx xx) 打印任意类型的数据出去

Properties

其实就是一个Map集合,但是我们一般不会当集合使用,因为HashMap更好用。

核心作用:

  • 代表的是一个属性文件,可以把自己对象中的键值对信息存入到一个属性文件中去。

    属性文件:后缀一般是.properties结尾的文件,里面的内容都是 key=value,用作系统配置信息

常用方法:

构造器 说明
void load(InputStream inStream) 从输入字节流读取属性列表(键和元素对)
void load(Reader reader) 从输入字符流读取属性列表(键和元素对)
void store(OutputStream out, String comments) 将此属性列表(键和元素对)写入此 Properties表中,以适合于使用 load(InputStream)方法的格式写入输出字节流
void store(Writer writer, String comments) 将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流
public Object setProperty(String key, String value) 保存键值对(put)
public String getProperty(String key) 使用此属性列表中指定的键搜索属性值 (get)
public Set stringPropertyNames() 所有键的名称的集合 (keySet())

commons-io

commons-io是apache开源基金组织提供的一组有关IO操作的类库,可以提高IO功能开发的效率。

commons-io工具包提供了很多有关io操作的类。有两个主要的类FileUtils, IOUtils。

FileUtils常用方法:

方法名 说明
String readFileToString(File file, String encoding) 读取文件中的数据, 返回字符串
void copyFile(File srcFile, File destFile) 复制文件。
void copyDirectoryToDirectory(File srcDir, File destDir) 复制文件夹。
posted @ 2023-07-06 17:13  水木夏  阅读(3)  评论(0编辑  收藏  举报