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();
            }
        }
    }
}
目录
打赏
0
0
0
0
1
分享
相关文章
重学Java基础篇—Java类加载顺序深度解析
本文全面解析Java类的生命周期与加载顺序,涵盖从加载到卸载的七个阶段,并深入探讨初始化阶段的执行规则。通过单类、继承体系的实例分析,明确静态与实例初始化的顺序。同时,列举六种触发初始化的场景及特殊场景处理(如接口初始化)。提供类加载完整流程图与记忆口诀,助于理解复杂初始化逻辑。此外,针对空指针异常等问题提出排查方案,并给出最佳实践建议,帮助开发者优化程序设计、定位BUG及理解框架机制。最后扩展讲解类加载器层次与双亲委派机制,为深入研究奠定基础。
26 0
|
12天前
|
《从头开始学java,一天一个知识点》之:输入与输出:Scanner与System类
你是否也经历过这些崩溃瞬间?三天教程连`i++`和`++i`都说不清,面试时`a==b`与`equals()`区别大脑空白,代码总是莫名报NPE。这个系列就是为你打造的Java「速效救心丸」!每天1分钟,地铁通勤、午休间隙即可学习。直击高频考点和实际开发中的“坑位”,拒绝冗长概念,每篇都有可运行代码示例。涵盖输入输出基础、猜数字游戏、企业编码规范、性能优化技巧、隐藏技能等。助你快速掌握Java核心知识,提升编程能力。点赞、收藏、转发,助力更多小伙伴一起成长!
39 19
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
66 23
重学Java基础篇—类的生命周期深度解析
本文全面解析了Java类的生命周期,涵盖加载、验证、准备、解析、初始化、使用及卸载七个关键阶段。通过分阶段执行机制详解(如加载阶段的触发条件与技术实现),结合方法调用机制、内存回收保护等使用阶段特性,以及卸载条件和特殊场景处理,帮助开发者深入理解JVM运作原理。同时,文章探讨了性能优化建议、典型异常处理及新一代JVM特性(如元空间与模块化系统)。总结中强调安全优先、延迟加载与动态扩展的设计思想,并提供开发建议与进阶方向,助力解决性能调优、内存泄漏排查及框架设计等问题。
27 5
|
13天前
|
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
43 11
|
6天前
|
重学Java基础篇—Java Object类常用方法深度解析
Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
18 1
|
19天前
|
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、"+"操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
课时11:综合实战:简单Java类
本次分享的主题是综合实战:简单 Java 类。主要分为两个部分: 1.简单 Java 类的含义 2.简单 Java 类的开发
|
20天前
|
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
45 5
课时37:综合实战:数据表与简单Java类映射转换
今天我分享的是数据表与简单 Java 类映射转换,主要分为以下四部分。 1. 映射关系基础 2. 映射步骤方法 3. 项目对象配置 4. 数据获取与调试