Java文件IO

White graces:个人主页

🙉专栏推荐:Java入门知识🙉

🙉 内容推荐:JUC常见类 🙉

🐹今日诗词:东风吹柳日初长,雨馀芳草斜阳🐹


⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏

⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏


目录

什么是IO

什么是文件

文件的存储

文件的路径

绝对路径

相对路径

文件检索

文本文件和二进制文件

Java操作文件

File类

patSeparator

File的构造方法

常见函数方法

文件创建

基准目录

文件删除

创建一级目录

创建多级目录

文件重命名

读写文件,打开关闭文件

字节流读数据

read()方法无参版本

[read(byte [] bytes)方法有参版本](#read(byte [] bytes)方法有参版本)

[read(bytep[] bytes, int off, int len)](#read(bytep[] bytes, int off, int len))

关闭文件

文件描述符表

字节流写数据

字符流读数据

Unicode和Utf8编码

字符流写数据

字符流和字节流与Scanner的爱情火花

文件搜索功能

文件复制功能

文件内容搜索功能

美图分享


什么是IO

这个不是靠感觉来的, 有人为的规定

什么是文件


文件夹是不是文件?

是文件: 文件夹被称作目录文件, 也是文件的一种

文件的存储

文件存储背后的数据结构是一个多叉树

文件的路径

绝对路径

windows从此电脑出发, 此电脑到指定文件的路径称为绝对路径

相对路径

从某一文件出发, 某一文件到指定文件的路径被称为相对路径

文件检索

检索通过 ./ 和 ../ 两个基础操作检索

举例:

  1. 在bin目录下查找qq.exe文件


2. 在bin目录的上一级目录(QQ目录)查找qq.exe


3. 在其他目录下查找qq.exe

文本文件和二进制文件

文本文件: 存储文本数据, 这些数据是合法的字符

二进制文件: 存啥都行(本质上是01都构成的)

如何区分文本文件和二进制文件

方法: 使用记事本打开, 乱码的是二进制文件, 不乱码的就是文本文件

Java操作文件

Java标准库内置了File类, 可以用来对文件进行操作

我们来看看File的属性和参数

File类

patSeparator

pathSeparator: 分割符

File的构造方法

有三个构造方法

我们来看看第二个如何使用吧!

常见函数方法

文件创建

基准目录

基准目录: 通常是程序当前工作的目录

文件删除


还有一种删除方式

deleteOnExit() 这种删除方式是程序运行完毕后才会删除文件

创建一级目录

通过mkdir()方法创建出一级目录

多级目录就是目录里面套目录

创建多级目录

通过mkdirs()方法创建多级目录

文件重命名

通过renameTo()方法进行文件重命名

读写文件,打开关闭文件

Java中读文件写文件打开关闭文件和"流"这样的类相关

流(stream)分成字节流和字符流

字节流: 以字节为单位读写数据

字符流: 以字符为单位读写数据

字节流读文件: InputStream

字节流写文件: OutputStream

字符流写文件: Writer

字符流读文件: Reader

字节流和字符从文件中读数据方法相同: read()

字节流和字符从文件中写数据方法相同: write()

字节流读数据

InputStream类: 这个类可以打开一个文件

类里的方法可以对文件进行读取数据的操作


正确使用方法: 虽然他是一个抽象类需要实现read()方法, 但是这样很麻烦,而且耦合性很大,

因此标准库提供了它的子类, 已经帮我们实现好了, 这个子类就是FileInputStream

read()方法无参版本

read(byte [] bytes)方法有参版本

read(bytep[] bytes, int off, int len)

关闭文件

打开文件, 用完之后要关闭

关闭文件: close()

文件描述符表

文件描述符表: 记录文件的IO信息

每打开文件时就会消耗资源记录信息, 关闭问价就会释放资源

close()方法是一个非常重要的方法, 打开文件之后一定要记得关闭, 某些情况下即使写了close方法也不一定会执行到, 比如下面这种情况

文件没有及时关闭的影响: 大部分情况下没啥影响, 如果多次打开文件,不去关闭文件, 导致文件描述符表被占满, 占满之后执行打开文件操作就会失败,

解决办法

可以把close()方法放到finally中


这种写法不是很优雅, 有一种更好的写法

try with resource

注意: 并不是所有的类都能放到try( ) 里, 只有实现了Closeable接口的类才可以, 这种写法在{ }

的代码执行完毕后会自动调用close方法

字节流写数据

OutputStream类: 这个类可以打开文件, 并且类里的方法可以向文件写入数据

OutputStream类中的write方法可以让我们向文件里写入数据

字符流读数据

Reader类用于读取字符流数据, 并且会自动打开对应的文件

类里的read方法可以读取字符类型的数据

read方法有四种版本

Unicode和Utf8编码

字符流写数据

Writer类: 可以打开指定文件, 如果不存在就会创建一个, 之后可以使用Writer类里的方法向文件中写入数据

write方法有四个版本

字符流和字节流与Scanner的爱情火花

以前我们都是Scanner scanner = new Scanner(System.in)的方式去输入信息

现在学了字节流和字符流读写数据, 因此可以让他们配合使用

文件搜索功能

文件的基础操作我们已经了解了, 我们可以基于这些方法写一个文件搜索功能

明确需求:

  1. 输入一个路径

  2. 输入一个关键词

  3. 在这个路径下查找文件, 这个文件名和关键词相同

文件复制功能

这个功能就比较简单了

要求: 输入两个路径复制路径和目的路径, 然后将复制路径文件的内容复制到目的路径文件中

解决步骤:

  1. 创建目的文件

  2. 读取文件内容

  3. 将内容复制到指定目录文件中

java 复制代码
import java.util.*;
import java.io.*;
//复制文件操作
public class Solution {
    public static void main(String[] args) throws IOException {
        //输入两个文件路径, 复制路径和目标路径
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要复制的文件路径: ");
        String src = scanner.next();
        System.out.println("请输入目的路径: ");
        String des = scanner.next();
        //判断路径是否合法
        File srcfile = new File(src);
        if (!srcfile.isFile()) {
            System.out.println("输入复制文件的路径不合法");
            return;
        }
        File desfile = new File(des);
        if(!desfile.getParentFile().isDirectory()) {
            //因为目的文件本事就不存在,所以判断它上一级目录文件存不存在
            System.out.println("输入的目的路径非法");
            return;
        }
        //1.创建文件
        //这里通过写的方式自动创建文件
        OutputStream outputStream = new FileOutputStream(desfile);
        //2.读取文件内容
        InputStream inputStream = new FileInputStream(srcfile);
        //3.写入文件内容
        int a = 0;
        while (a != -1) {
            byte[] bytes = new byte[1024];
            a = inputStream.read(bytes);
            outputStream.write(bytes);
        }
    }
}

测试一下

文件内容搜索功能

要交:

输入一个路径和关键词, 在这个路径下, 查找文件内容(不是文件名)包含关键词的文件

解题步骤

  1. 判断路径是否非法

  2. 遍历文件

  3. 遍历文件内容

  4. 返回文件路径

java 复制代码
import java.util.*;
import java.io.*;
public class Solution {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要搜索的路径: ");
        String path = scanner.next();
        System.out.println("请输入文件内容的关键词: ");
        String str = scanner.next();
        //1.判断路径是否存在
        File pathfile = new File(path);
        if (!pathfile.exists()) {
            System.out.println("搜索路径非法!");
            return;
        }
        //2. 遍历路径下的所有文件
        SearchFile(pathfile, str);
    }
    public static void SearchFile(File pathfile, String str) throws IOException {
        if (pathfile == null) {
            return;
        }
        if (pathfile.isDirectory()) {
            File[] files = pathfile.listFiles();
            //如果是一个目录文件就继续递归
            for (File file : files) {
                SearchFile(file, str);
            }
        } else {
            //是普通文件, 就遍历文件内容
            Searchstr(pathfile, str);
        }
    }
    public static void Searchstr(File pathfile, String str) throws IOException{
        Reader reader = new FileReader(pathfile);
        int a = 0;
        StringBuilder tmp = new StringBuilder();
        while( a != -1) {
            a = reader.read();
            tmp.append((char) a);
            if (tmp.indexOf(str) >= 0) {
                System.out.println("找到了符合条件的文件: " + pathfile.getAbsolutePath());
                return;
            }
        }
    }
}

运行结果

美图分享

✨🎆谢谢你的阅读和耐心!祝愿你在编程的道路上取得更多的成功与喜悦!"🎆✨🎄

⭐️点赞收藏加关注,学习知识不迷路⭐️

🎉✔️💪🎉✔️💪🎉✔️💪🎉✔️💪🎉

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️

相关推荐
小刘|4 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
南宫理的日知录6 分钟前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
逊嘘23 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
Half-up25 分钟前
C语言心型代码解析
c语言·开发语言
morris13130 分钟前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
Source.Liu1 小时前
【用Rust写CAD】第二章 第四节 函数
开发语言·rust
monkey_meng1 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马1 小时前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng1 小时前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
七星静香1 小时前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel