Java 进阶File类、IO流

简介: 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");

相对路径

5d0c438715b31b415e87cfe2db62637.png

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() 获取文件的最后修改时间(时间毫秒值)

实战(实现方法)

11e548dddbdf9aba33d17d146bb6734.png

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

59cf03b0e632c3f236d0cbbd9a8b585.png

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流体系图

6668a6173c27c1beb3b55ba13020b82.png

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数组缓冲区

70d8d5f10983216e1b5cc73adb0e6f3.png

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() 关闭流,释放资源,但是在关闭之前会先刷新流;

一旦关闭,就不能再写数据

c97c092233c4493f46e4ab5eaee5687.png

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后面的,无论是正常执行还是异常执行代码,最后一定要执行,特殊情况除外

33a9db3727ddd2f4b4800558f0422b9.png

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();
            }
        }
    }
}
相关文章
|
1天前
|
Java 调度
Calendar类在Java中的应用
Calendar类在Java中的应用
|
1天前
|
Java
Java中Integer类的应用
Java中Integer类的应用
|
2天前
|
Java
深入了解Java中的BigDecimal类及其方法
深入了解Java中的BigDecimal类及其方法
9 1
|
20小时前
|
开发框架 Java
JAVA反射:揭秘!运行时如何窥探类的秘密?
【6月更文挑战第30天】Java反射是运行时检查类信息并动态操作对象的机制。通过`Class`对象,我们可以访问私有成员,如在Person类示例中设置私有变量name和调用方法。反射增加了代码灵活性,常用于动态类型、插件和框架设计。
|
2天前
|
Java 数据安全/隐私保护
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
9 0
|
2天前
|
安全 NoSQL Java
探索Java Optional类:构造器、成员变量与方法
探索Java Optional类:构造器、成员变量与方法
4 0
|
3天前
|
Java 编译器
Java 从入门到进阶之路(八)
Java 从入门到进阶之路(八)
|
3天前
|
存储 Java API
Java基础之String类
Java的String类是引用类型,用于创建和操作字符串。字符串对象在`java.lang`包中,不可变。创建方式包括字面量和`new`关键字。字符串池存储字符串常量,避免重复。比较字符串用`equals()`(区分大小写)和`equalsIgnoreCase()`(不区分大小写)。`length()`返回长度,`concat()`或`+`拼接,`substring()`截取,`indexOf()`和`lastIndexOf()`查找,`replace()`替换,`split()`分割。这些是常用的字符串API。
7 0
|
3天前
|
Java
Java基础之String类
Java基础之String类
8 0
|
3天前
|
人工智能 算法 Java
Java进阶代码的具体写法
Java进阶代码的具体写法