Java实现文件操作

news2025/1/11 2:50:00

目录

一、文件概述

二、常见文件操作 

1、获取文件路径 

2、判断文件存在以及判断类型

3、文件的创建与删除 

4、展示文件夹的文件 

5、创建文件夹 

三、用数据流来读取文件内容 

1、操作字节流文件

a、读取字节流文件

b、写字节流文件

2、操作字符流对象 

a、读取字符流文件

b、写字符流文件 

四、常见题目

1、扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件。

2、复制普通文件 

3、扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)


一、文件概述

在计算机中,通常都需要文件系统来管理文件,文件系统中通过“树形” 组织文件和目录,文件可以分为文本文件和二进制文件,如果文件记事本打开出现乱码就是二进制文件,否则就是文本文件,常见的二进制文件有:.txt,.c,.java等;常见的文本文件有:.doc,.jpg,.class以及office系列的一些文件。

在文件系统中,文件的路径可以分为绝对路径和相对路径。

绝对路径:就是从根目录开始到文件,也就是从盘符开始的文件,例如:D:\bin\aa\c.txt

相对路径:以./或者../开头的路径,./代表当前目录,../代表父目录(上级目录),在相对路径中必须有一个基准目录,例如:./c.txt

二、常见文件操作 

1、获取文件路径 

getParent():获取File对象的父目录的文件路径。

getPath():返回File对象的文件路径,就是在创建File对象时指定的路径。

getAbsolutePath():返回File对象的绝对路径,该方法在返回时会将绝对路径中的./和../理解成正确路径。

getCanonicalPath():返回File对象修饰过的绝对路径。

例如:利用相对路径和绝对路径创建文件。 

public static void main(String[] args) throws IOException {
        File file = new File("D:/test/test.doc");
        System.out.println(file.getParent());
        System.out.println(file.getPath());
        System.out.println(file.getAbsoluteFile());
        System.out.println(file.getCanonicalFile());
        System.out.println("____________________________");
        File file1=new File("./test.txt");
        System.out.println(file1.getParent());
        System.out.println(file.getPath());
        System.out.println(file1.getAbsoluteFile());
        System.out.println(file1.getCanonicalFile());
    }

运行结果:

2、判断文件存在以及判断类型

exists():判断File对象是否存在。

isFile():判断File对象是否为一个普通文件。

isDirectory():判断File对象是否为一个目录文件。

操作演示:

 public void static void main(String[] args){
    File file = new File("D:/test/test.doc");
    System.out.println(file.exists());
    System.out.println(file.isFile());
    System.out.println(file.isDirectory());
}

 运行结果:

3、文件的创建与删除 

createNewFile():会根据File对象自动地创建一个空文件。

delete():删除文件,删除成功后,返回true;

deleteOnExit():根据File对象,标注文件将会被删除,删除动作会到JVM运行结束时才会进行。也就是说在程序运行结束时才会执行删除操作。

public static void main(String[] args) throws IOException {
        File file=new File("./abc.txt");
        file.createNewFile();
        System.out.println(file.exists());
        file.delete();
        System.out.println(file.exists());
}

运行结果:

4、展示文件夹的文件 

list():返回值是String[],返回的是目录文件下的所有文件名。

listFiles():返回值是File(),返回的是目录文件下的所有的文件。 

public static void main(String[] args) throws IOException {
        File file=new File("d:/test");
        String[] fileNames=file.list();
        for(int i=0;i< fileNames.length;i++){
            System.out.print(fileNames[i]+" ");
        }
        System.out.println();
        File[] files=file.listFiles();
        for(int i=0;i<files.length;i++){
            System.out.print(files[i] + " ");
        }
}

运行结果:

5、创建文件夹 

mkdir():创建单个目录文件。

mkdirs():创建多个嵌套的目录文件。

 public static void main(String[] args) throws IOException {
        File file=new File("D:/test/a");
        file.mkdir();
        System.out.println(file.getAbsolutePath());
        File file2=new File("D:/test/sa/wq/a/c");
        file.mkdirs();
        System.out.println(file2.getAbsolutePath());
}

运行结果:

三、用数据流来读取文件内容 

 在Java标准库中提供了一组类来进行文件操作:
字节流文件:也就是二进制文件,以字节的方式进行读写,利用InputStream和OutputStream类进行操作。

字符流文件:以字符的方式进行读取,利用Reader和Writer类进行操作。

但是上述的四个类都是抽象类,在真正实现时采用FileInputStream、FileOutputStream、FileReader和FileWriter。

1、操作字节流文件

a、读取字节流文件

需要创建一个FileinputStream流对象,利用read方法读取字符流文件时使用byte[]字节数组进行接收,最后对byte数组进行遍历输出。

注意:在读取文件以及关闭文件时可能都会出现IOException,于是在try()的括号中构建实例,这样就不用在finally中关闭流对象,会自动关闭。

try(InputStream inputStream=new FileInputStream("D:\\one-question-per-day\\src\\test.txt")){
            byte[] buffer=new byte[1024];
            int len;
            while(true){
                len=inputStream.read(buffer);
                if(len==-1){
                    break;
                }
                System.out.println(Arrays.toString(buffer));

            }

        }catch (IOException e){
            e.printStackTrace();
        }

b、写字节流文件

需要创建一个FileOutputStream流对象,然后同样也是try—catch处理异常,然后利用write()方法向指定文件写入内容。

try(OutputStream outputStream=new FileOutputStream("D:\\one-question-per-day\\src\\test.txt")){
            outputStream.write(11);
            outputStream.write(90);
            outputStream.write(23);
        }catch(IOException e){
            e.printStackTrace();
        }

2、操作字符流对象 

a、读取字符流文件

需要创建一个FileReader对象,再创建一个char[]型数组用于接收文件的字符,最后再对char数组进行遍历。

try(Reader reader=new FileReader("D:\\one-question-per-day\\src\\test.txt")){
            char[] chars=new char[1024];
            int len;
            while(true){
                len=reader.read(chars);
                if(len==-1){
                    break;
                }
                for(int i=0;i<len;i++){
                    System.out.println(chars[i]);
                }

            }

        }catch (IOException e){
            e.printStackTrace();
        }

b、写字符流文件 

需要创建一个FileWriter对象,再用write()方法写入指定文件。

try(Writer writer=new FileWriter("D:\\one-question-per-day\\src\\test.txt")){
            writer.write(99);
            writer.write('x');
            writer.write('a');
        }catch (IOException e){
            e.printStackTrace();
        }

四、常见题目

1、扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件。

解题思路:首先输入要指定的目录文件的路径和指定字符,首先需要判断路径是否有效,接着再利用listFiles()列出目录中的文件存放到files数组中,对数组进行遍历,若是普通文件则询问删除,若是目录文件,则递归调用本身方法。

public static void deleteFile(String path,String name){
        File file=new File(path);
        if(!file.exists()){
            System.out.println("指定路径的文件不存在");
        }
        File[] files=file.listFiles();
        if(files==null){
            return;
        }
        for(File f:files){
            if(f.isDirectory()){
                deleteFile(f.getAbsolutePath(),name);
            }
            if(f.isFile()){
                if(f.getName().contains(name)){
                    System.out.println(f.getAbsolutePath()+"确认删除吗?(y/n)");
                    Scanner sc=new Scanner(System.in);
                    char option=sc.next().charAt(0);
                    if(option=='y'){
                        f.delete();
                    }else if(option!='n'){
                        System.out.println("输入有误");
                    }
                }
            }
        }
    }


    public static void main(String[] args) {
       System.out.println("请输入要检索的文件路径");
        Scanner sc=new Scanner(System.in);
        String str=sc.next();
        System.out.println("请输入要删除的文件名包含的信息");
        String str2=sc.next();
        deleteFile(str,str2);
    }

2、复制普通文件 

解题思路:分别创建输入流对象和输出流对象,然后定义byte数组,对原文件进行读取,将读取的内容写入新复制的文件。

public static File copyFile(File file) throws IOException {
        if(!file.exists()){
            System.out.println("文件不存在");
        }
        File dFile=new File("dFile.txt");
        try(InputStream inputStream=new FileInputStream(file)){
            try(OutputStream outputStream=new FileOutputStream(dFile)){
                byte[] buffer=new byte[1024];
                int len=0;
                while(true){
                    len= inputStream.read(buffer);
                    if(len==-1){
                        break;
                    }
                    outputStream.write(buffer,0,len);
                }
            }
        }
        return dFile;
    }

3、扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)

解题思路:该题与第一题类似,也需要用到递归思想,本题着重在于如何确定文件内容中是否含有指定字符。可以利用StringBuilder对象,将每次读到的内容添加进去,再在StringBuilder对象中检索是否包含指定字符。

public static void scanFile(File file,String massage) throws FileNotFoundException {
        if(!file.exists()){
            System.out.println("文件不存在");
        }
        File[] files=file.listFiles();
        if(files==null){
            return;
        }

        for(File f:files){
            if(f.isFile()){
                if(f.getName().contains(massage)||content(f,massage)){
                    System.out.println(f.getName());
                }
            }
            if(f.isDirectory()){
                scanFile(f,massage);
            }
        }
    }
    public static boolean content(File file,String massage) throws FileNotFoundException {
        StringBuilder stringBuilder=new StringBuilder();
        try(Reader reader=new FileReader(file)) {
            char[] chars=new char[1024];
            int len=0;
            while(true){
                len=reader.read(chars);
                if(len==-1){
                    break;
                }
                stringBuilder.append(chars,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.indexOf(massage)==-1;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146323.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ · 入门 · 03 | 函数重载

啊我摔倒了..有没有人扶我起来学习.... 目录前言函数重载1.1 函数重载概念1.2 函数重载的意义1.3 C支持函数重载的原理--名字修饰(name Mangling)1.4 返回值不同能否构成函数重载?前言 自然语言中&#xff0c;一个词可以有多重含义&#xff0c;人们可以通过上下文来判断该词真…

小米 2021 秋招面试总结

岗位:嵌入式软件工程师(相机驱动岗) 面试时间: 40 分钟 薪资: 28w+ 面试过程 面试官上来先来了一段他自己的自我介绍,流程还是比较规范的。 1、请进行一个简单的自我介绍(2分钟) 2、C语言全局变量可否定义在头文件中? 回答:不能,并且这不是一个好的习惯。 3…

【自学C++】C++输出cout

C输出cout C输出cout教程 在 C 语言 中我们需要输出一个 变量&#xff0c;可以使用 printf。printf 函数 在输出时&#xff0c;我们必须要指定输出的数据类型对应的格式化符&#xff0c;挺不方便。 在 C 中&#xff0c;我们要输出变量&#xff0c;直接使用 std 命名空间中的…

国科大抢课避坑+选课指南+教务系统操作

博客园&#xff1a; https://www.cnblogs.com/phoenixash/p/13669461.html 9月12日12&#xff1a;30&#xff0c;本菜鸡终于经历了国科大传说中的抢课大战&#xff0c;虽然自己之前准备的较多&#xff0c;但还是在抢课的时候掉进了不少坑里&#xff0c;趁现在还记忆犹新&#x…

【pandas】教程:10-文本数据的操作

Pandas 文本数据的操作 本节使用的数据为 data/titanic.csv&#xff0c;链接为 pandas案例和教程所使用的数据-机器学习文档类资源-CSDN文库 读入数据 import pandas as pd titanic pd.read_csv("data/titanic.csv")PassengerId Survived Pclass \ 0 …

指针进阶(2)

Tips 1. 2. 3. 碰到地址就等价于指针变量&#xff0c;里面存放着该地址的指针变量 4. 数组指针是存放数组的地址&#xff0c;指向的是一个数组&#xff1b;函数指针存放的是函数的地址&#xff0c;指向的是一个函数。 5. 地址就是指针&#xff0c;地址就是指针 6. 数…

LeetCode 138. 复制带随机指针的链表(C++)

思路&#xff1a; 用哈希表实现&#xff0c;创建一个哈希表来对应原链表中的每一个节点&#xff0c;这样也可以将原链表中的所有结点的next和random关系映射到哈希表复制链表中。 原题链接&#xff1a;https://leetcode.cn/problems/copy-list-with-random-pointer/description…

1658. 将 x 减到 0 的最小操作数

解法一&#xff1a;双指针 首先&#xff0c;每次操作可以移除数组 nums 最左边或最右边的元素&#xff0c;那么相当于求出l和rl和rl和r使得[0,l][r,n−1][0, l][r,n-1][0,l][r,n−1]之间所有元素之和等于xxx,并且元素个数最少。我们可以通过双重循环枚举l和r变量l和r变量l和r变…

马哥架构第1周课程作业

马哥架构第1周课程作业一. 画图解释一次web请求的过程。涉及tcp/ip, dns, nginx&#xff0c;wsgi。二. 编译安装nginx, 详细解读常用参数。三. 基于nginx完成动静分离部署 lamp。php到后端php-fpm, static/ 在nginx本地。3.1 配置 nginx 实现反向代理的动静分离3.2 准备后端 ht…

equals和==的区别

目录 1.基本数据类型和引用数据类型的说明 2. 3.equals 1.基本数据类型和引用数据类型的说明 基本数据类型&#xff1a;byte&#xff0c;short&#xff0c;int&#xff0c;long&#xff0c;float&#xff0c;double&#xff0c;char&#xff0c;boolean。 对应的默认值&…

2-4进程管理-死锁

文章目录一.死锁的概念二.死锁的处理策略1.死锁预防&#xff1a;破坏必要条件&#xff0c;让死锁无法发生2.避免死锁&#xff1a;在动态分配资源的过程中&#xff0c;用一些算法防止系统进入不安全状态&#xff08;1&#xff09;银行家算法&#xff08;2&#xff09;系统安全状…

Java if else分支结构精讲

Java 支持两种选择语句&#xff1a;if 语句和 switch 语句。其中 if 语句使用布尔表达式或布尔值作为分支条件来进行分支控制&#xff0c;而 switch 语句则用于对多个整型值进行匹配&#xff0c;从而实现分支控制。这些语句允许你只有在程序运行时才能知道其状态的情况下&#…

2022:不恋过往,不畏将来

一、开篇 少年有山海&#xff0c;踏过皆繁华。岁月不居&#xff0c;时节如流&#xff0c;时间在指尖悄悄流逝&#xff0c;人生即将翻开新的一年的篇章。2022年&#xff0c;注定是一个不平凡的年份&#xff0c;这一年&#xff0c;我们从关心世界到关心国家&#xff0c;最后关心自…

2023年12306购票平台自动化购票二|解决车次查找与预定

目录 一、说明 1.1、背景 1.2、说明 二、步骤 2.1、点击去购票 2.2、在搜索框中输入车次信息 2.3、点击查找 2.4、出现车次信息&#xff0c;进行筛选&#xff0c;如果有票则点击计入预定车票界面 三、结果 四、小节 一、说明 1.1、背景 接上文&#xff0c;春运抢不到…

适用于 Windows 的 5 大 PDF 编辑器

“如何在 Windows 7/8/10/11 上编辑 PDF 文件&#xff1f;” “适用于 Windows 7/8/10/11的最佳 PDF 编辑器是什么&#xff1f;” 升级到 Windows 7/8/10/11 后&#xff0c;你会发现很多应用程序在新的 Windows 系统上无法运行&#xff0c;包括 PDF 编辑器。然而&#xff0c;一…

POJ 3070 Fibonacci

Time Limit: 1000MSMemory Limit: 65536KTotal Submissions: 30932Accepted: 20284 Description In the Fibonacci integer sequence, F0 0, F1 1, and Fn Fn − 1 Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are: 0, 1, 1, 2, 3,…

opencv源码之中值滤波medianBlur_SortNet解读

背景中值滤波&#xff0c;最大值滤波&#xff0c;最小值滤波属于排序滤波&#xff0c;常用于图像去噪处理。最大/小值滤波的处理比较好理解&#xff0c;就是逐个比较窗口内的每个数字&#xff0c;每次比较会根据所属任务保留最大值&#xff0c;或最小值。假设滑动窗口是3*3&…

固体物理分子模拟实验(二)MPI的安装

固体物理分子模拟实验&#xff08;二&#xff09;MPI的安装 文章目录固体物理分子模拟实验&#xff08;二&#xff09;MPI的安装前言一、MPI是什么&#xff1f;二、安装步骤&#xff08;Ubuntu22.04mpich-4.0.2&#xff09;1、下载mpich解压包2、安装前置组件3、文件配置&#…

【一文讲通】如何检测数据满足同分布

1 统计指标的方法1.1群体稳定性指标&#xff08;Population Stability Index&#xff0c;PSI&#xff09;群体稳定性指标&#xff08;Population Stability Index&#xff0c;PSI&#xff09;&#xff0c; 衡量未来的样本&#xff08;如测试集&#xff09;及训练样本评分的分布…

【Linux】基础开发工具使用 --- vim

目录 前言 vim的基本概念 具体操作 插入模式 命令模式下的指令 底行模式下的指令 vim的配置 前言 &#x1f367;了解了 Linux 的一些基本的指令之后若要在 Linux 上进行程序的编写&#xff0c;除了 nano 以外&#xff0c;我们还可以选择 vim 进行编写。而 vim 是 vi 升级…