Java 进阶File类、IO流

一、File类

1、概述

File类的文件代表操作系统的文件或文件夹

2、创建对象

1)方法

方法名 解释
public File​(String pathname) 根据文件路径创建文件对象
public File​(String parent, String child) 根据父路径名字符串和子路径名字符串创建文件对象
public File​(File parent, String child) 根据父路径对应文件对象和子路径名字符串创建文件对象
  • 注意

File对象可以定位文件和文件夹
File封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以是不存在的

2)创建文件 File file = new File(路径)

  • 绝对路径
File file = new File("D:\\aa.txt");
  • 相对路径

在这里插入图片描述

File file = new File("data/ip.txt");

3)File的文件类型和获取信息

方法名 解释
public boolean isDirectory() 判断是否为文件夹
public boolean isFile() 判断是否为文件
public boolean exists() 判断是否存在
public long length() 获取文件的大小(字节数量)
public String getAbsolutePath() 获取文件的绝对路径
public String getPath() 获取定义文件时使用的路径
public String getName() 获取文件的名称,带后缀
public long lastModified() 获取文件的最后修改时间(时间毫秒值)
  • 实战(实现方法)
    在这里插入图片描述
import java.io.File;

public class ClassStructure {
    
    
    public static void main(String[] args) {
    
    
        File file = new File("data/ip.txt");
        //是否为文件夹
        System.out.println(file.isDirectory());
        //是否为文件
        System.out.println(file.isFile());
        //是否存在
        System.out.println(file.exists());
        //文件的大小(字节数量)
        System.out.println(file.length());
        //文件的绝对路径
        System.out.println(file.getAbsolutePath());
        //定义文件时使用的路径
        System.out.println(file.getPath());
        //文件的名称,带后缀
        System.out.println(file.getName());
        //文件的最后修改时间(时间毫秒值)
        System.out.println(file.lastModified());
    }
}

4)File文件创建和删除

  • 创建文件
方法名 解释
public boolean createNewFile() 创建新的空文件
public boolean mkdir() 只能创建一级文件夹
public boolean mkdirs() 可以创建多级文件夹

在这里插入图片描述

import java.io.File;
import java.io.IOException;

public class ClassStructure {
    
    
    public static void main(String[] args) throws IOException {
    
    
        File file = new File("data1");
        //只能创建一层文件夹
        boolean mkdir = file.mkdir();
        System.out.println(mkdir);

        File file1 = new File("data1\\data");
        //创建多层文件夹
        System.out.println(file1.mkdirs());

        //创建新文件
        File file2 = new File("data1\\data\\test.txt");
        boolean newFile = file2.createNewFile();
        System.out.println(newFile);
    }
}

  • 删除文件
方法名 解释
public boolean delete​() 删除由此抽象路径名表示的文件或空文件夹;
delete方法默认只能删除文件和空文件夹,delete方法直接删除不走回收站

在这里插入图片描述

import java.io.File;
import java.io.IOException;

public class ClassStructure {
    
    
    public static void main(String[] args) throws IOException {
    
    
        File file = new File("data1\\data\\test.txt");
        //删除文件
        boolean delete = file.delete();
        System.out.println(delete);
    }
}

  • 不能删除非空文件夹
    在这里插入图片描述
import java.io.File;
import java.io.IOException;

public class ClassStructure {
    
    
    public static void main(String[] args) throws IOException {
    
    
        File file = new File("data1");
        //删除文件
        boolean delete = file.delete();
        System.out.println(delete);
    }
}

5)File文件遍历

方法名 解释
publicString[]list() 获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回
publicFile[]listFiles() 获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回
  • listFiles()注意事项:

返回为null的情况,可以有效避免遍历返回数组时候出现运行时异常
File对象不存在时或者代表文件时,返回null
File对象代表一个空文件夹时,返回一个长度为0的数组
File对象是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
File对象是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
File对象权限访问该文件夹时,返回null

在这里插入图片描述

import java.io.File;
import java.io.IOException;

public class ClassStructure {
    
    
    public static void main(String[] args) throws IOException {
    
    
        File dir = new File("data\\nest");
        File[] files = dir.listFiles();
        for (File file : files) {
    
    
            System.out.println(file);
        }
    }
}

二、IO流

1、IO流体系图

在这里插入图片描述

2、概念

I标识Input,数据从硬盘到内存读入的过程,叫输入,负责读
O标识Output,数据从内存到写出到硬盘的过程,叫输出,负责写

3、FileInputStream文件字节输入流

把磁盘中的数据已字节的形式读入到内存中

构造器 解释
public FileInputStream​(File file) 创建字节输入流管道与源文件对象接通
public FileInputStream​(String pathname) 创建字节输入流管道与源文件路径接通
方法名 解释
public int read() 每次读取一个字节,没有字节返回-1
public int read(byte[] buffer) 每次读取一个字节数组,没有字节返回-1
public int read(byte[] buffer,int off,int len) 从下标off的位置开始读取最多len个字节数据储存于buffer数组缓冲区

在这里插入图片描述

import java.io.FileInputStream;
import java.io.IOException;

public class ClassStructure {
    
    
    public static void main(String[] args) throws IOException {
    
    
        int read = 0;
        //创建一个读入数据的相对路径的流
        FileInputStream fileInputStream = new FileInputStream("data/access.log");
        /* int i
        //判断文件是否为空,否则一直读取打印
         while ((read = fileInputStream.read()) != -1){
            System.out.print((char)read);
        }
        System.out.println();
         */

        /*  byte[] buffer
        //创建一个8字节数组
        byte[] by = new byte[8];
        //读取流
        read = fileInputStream.read(by);
        System.out.println(read);
        //转换为字符串
        String str = new String(by);
        System.out.println(str);
         */
        /*
        byte[] buffer , int pos , int len  指定输出流
         */
        //创建一个8字节数组
        byte[] by = new byte[8];
        //判断文件是否为空,否则一直读取打印
        while((read = fileInputStream.read(by)) != -1){
    
    
            //转换为字符串
            String str = new String(by,0,read);
            System.out.println(str);
        }

        //读取完流必须关闭
        fileInputStream.close();
    }
}

4、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 i) 一个字符数据写入输入流
public void write(byte[] buffer) 字符类型数组中的数据写入输出流
public void write(byte[] buffer , int pos , int len) 字符类型数组中的指定部分数据写入输出流
flush() 刷新流,可以继续写数据
close() 关闭流,释放资源,但是在关闭之前会先刷新流;
一旦关闭,就不能再写数据

在这里插入图片描述

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ClassStructure {
    
    
    public static void main(String[] args) throws IOException {
    
    
        int read = 0;
        //创建一个读入数据的相对路径的流
        FileInputStream fileInputStream = new FileInputStream("data/access.log");
        FileOutputStream fileOutputStream = new FileOutputStream("data/access1.log");
        /* int i
        //判断文件是否为空,否则一直读取打印
        while ((read = fileInputStream.read()) != -1){
            //把文件内容直接写入到access1.log中
            fileOutputStream.write(read);
        }
        System.out.println();
        /*
        byte[] buffer , int pos , int len  指定输出流
         */
        //创建一个8字节数组
        byte[] by = new byte[8];
        //判断文件是否为空,否则一直读取打印
        while((read = fileInputStream.read(by)) != -1){
    
    
            fileOutputStream.write(by,0,read);
        }
        System.out.println("复制OK");
        //将输出流的缓冲流数据全部写出到达目的地
        fileOutputStream.flush();
        //读取完流必须关闭
        fileInputStream.close();
        //写入完流必须关闭
        fileOutputStream.close();
    }
}

5、try-catch-finally资源释放

finally:放在try-catch后面的,无论是正常执行还是异常执行代码,最后一定要执行,特殊情况除外

在这里插入图片描述

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class ClassStructure {
    
    
    public static void main(String[] args) throws FileNotFoundException {
    
    
        int read = 0;
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        //创建一个读入数据的相对路径的流
        fileInputStream = new FileInputStream("data/access.log");
        fileOutputStream = new FileOutputStream("data/access1.log");
        try {
    
    
            //判断文件是否为空,否则一直读取打印
            while ((read = fileInputStream.read()) != -1) {
    
    
                //把文件内容直接写入到access1.log中
                fileOutputStream.write(read);
            }
            System.out.println();
            System.out.println("复制OK");
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            //将输出流的缓冲流数据全部写出到达目的地
            try {
    
    
                fileOutputStream.flush();
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
            try {
    
    
                //读取完流必须关闭
                if (fileInputStream != null) {
    
    
                    fileInputStream.close();
                }
                //写入完流必须关闭
                if (fileOutputStream != null) {
    
    
                    fileOutputStream.close();
                }
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/walykyy/article/details/126682744