Java中常见的文件操作

news2024/11/18 7:49:04

作者:~小明学编程 

文章专栏:JavaEE

格言:热爱编程的,终将被编程所厚爱。
在这里插入图片描述

目录

操作文件

File类

属性

构造方法

常见方法

重要方法的操作演示

文件内容的读写

FileInputStream

OutputStream

按照字符读入

按照字符写入

实战用法


操作文件

Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意,有 File 对象,并不
代表真实存在该文件。

File类

属性

修饰符及类型属性说明
static StringpathSeparator依赖于系统的路径分隔符,String 类型的表示
static charpathSeparator依赖于系统的路径分隔符,char 类型的表示

构造方法

签名说明
File(File parent, String
child)
根据父目录 + 孩子文件路径,创建一个新的 File 实例
File(String pathname)根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者
相对路径
File(String parent, String
child)
根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用
路径表示

常见方法

修饰符及返回
值类型
方法签名说明
StringgetParent()返回 File 对象的父目录文件路径
StringgetName()返回 FIle 对象的纯文件名称
StringgetPath()返回 File 对象的文件路径
StringgetAbsolutePath()返回 File 对象的绝对路径
StringgetCanonicalPath()返回 File 对象的修饰过的绝对路径
booleanexists()判断 File 对象描述的文件是否真实存在
booleanisDirectory()判断 File 对象代表的文件是否是一个目录
booleanisFile()判断 File 对象代表的文件是否是一个普通文件
booleancreateNewFile()根据 File 对象,自动创建一个空文件。成功创建后返
回 true
booleandelete()根据 File 对象,删除该文件。成功删除后返回 true
voiddeleteOnExit()根据 File 对象,标注文件将被删除,删除动作会到
JVM 运行结束时才会进行
String[]list()返回 File 对象代表的目录下的所有文件名
File[]listFiles()返回 File 对象代表的目录下的所有文件,以 File 对象
表示
booleanmkdir()创建 File 对象代表的目录
booleanmkdirs()创建 File 对象代表的目录,如果必要,会创建中间目
booleanrenameTo(File
dest)
进行文件改名,也可以视为我们平时的剪切、粘贴操
booleancanRead()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限

重要方法的操作演示

    public static void main(String[] args) throws IOException {
        File file = new File("D:\\.11111\\Demo");
        System.out.println(file.getParent());//获取父目录的文件名称
        System.out.println(file.getName());//获取文件名
        System.out.println(file.getPath());//获取到文件的路径
        System.out.println(file.getAbsoluteFile());//返回 File 对象的绝对路径
        System.out.println(file.getCanonicalPath());//返回 File 对象的修饰过的绝对路径

        File file1 = new File("./demo.txt");//输入一个基准路径
        System.out.println(file1.getParent());//获取父目录的文件名称
        System.out.println(file1.getName());//获取文件名
        System.out.println(file1.getPath());//获取到文件的路径(构造方法中的路径)
        System.out.println(file1.getAbsoluteFile());//在基准路径的基础上把相对路径给拼接上去
        System.out.println(file1.getCanonicalPath());//返回 File 对象的修饰过的绝对路径
    }

首先给大家介绍的就是绝对路径和相对路径,绝对路径就是我们常见的D:\.1学习资料\JavaEE初阶

这种写法,而相对路径就是./test.txt  的这种写法其中的点就是我们当前所在的路径。

这是上述代码的打印结果,值得注意的是 getAbsoluteFile()是对我们相对路径和基准路径的一个拼接,而getCanonicalPath()是直接打印这个完整的路径。

    public static void main(String[] args) {
        File file = new File("D:\\.11111\\Demo");
        System.out.println(file.exists());//判断对象描述的文件是否存在
        System.out.println(file.isDirectory());//判断对象描述的是否是一个目录
        System.out.println(file.isFile());//判断当前是否是一个普通的文件

    }

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

    public static void main(String[] args) {
        File file = new File("./test.txt");
        System.out.println(file.exists());//true
        file.delete();//删除文件
        System.out.println(file.exists());//false
    }
    public static void main(String[] args) {
        File file = new File("./aaa/bbb/ccc/ddd");
        file.mkdirs();//创建多级目录

    }
    public static void main1(String[] args) {
        File file = new File("./aaa");
        file.mkdir();//创建该目录
        System.out.println(file.isDirectory());
    }
    public static void main(String[] args) {
        File file = new File("./");
        System.out.println(Arrays.toString(file.list()));//返回当前目录下的所有文件
        System.out.println(Arrays.toString(file.listFiles()));//返回当前目录下的所有文件,以file对象表示

    }
    public static void main(String[] args) {
        File file = new File("./aaa");
        File file1 = new File("./www");
        file.renameTo(file1);//更改当前目录的名字
    }

文件内容的读写

FileInputStream

常用方法

修饰符及
返回值类
方法签名说明
intread()读取一个字节的数据,返回 -1 代表已经完全读完了
intread(byte[] b)最多读取 b.length 字节的数据到 b 中,返回实际读到的数
量;-1 代表以及读完了
intread(byte[] b,
int off, int len)
最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返
回实际读到的数量;-1 代表以及读完了
voidclose()关闭字节流
    public static void main(String[] args){
        //构造方法里面的路径可以是绝对路径也可以是相对路径
        InputStream input = null;
        try {
            input = new FileInputStream("D:\\.11111\\Demo\\as.txt");
            int b = 0;
            while (b!=-1) {
                b = input.read();
                System.out.println(b);
            }
            input.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                input.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

这里要注意我们的回收资源,但是这种写法有些的繁琐,所以我们就有了下面的这种写法。

    public static void main(String[] args) {
        try (InputStream input = new FileInputStream("D:\\.11111\\Demo\\as.txt")){//自动回收
            int b = 0;
            while (b!=-1) {
                b = input.read();
                System.out.println(b);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

我们在try里面把对象就给构造出来,这样就不用我们再去回收资源了,但是这种写法要保证我们当前的类是实现了Closeable接口的。

    public static void main3(String[] args) {
        try(InputStream inputStream = new FileInputStream("D:\\.11111\\Demo\\as.txt")) {
            while (true) {
                byte[] bytes = new byte[1024];
                int len = inputStream.read(bytes);//返回的是读到的长度
                if (len==-1) {
                    break;
                }
                for (int i = 0; i < len; i++) {
                    System.out.println(bytes[i]);
                }

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

我们也可以一次性读多个字节然后把读到的字节放到数组里面去。

OutputStream

修饰
符及
返回
值类
方法签名说明
voidwrite(int b)写入要给字节的数据
voidwrite(byte[]
b)
将 b 这个字符数组中的数据全部写入 os 中
intwrite(byte[]
b, int off,
int len)
将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个
voidclose()关闭字节流
voidflush()重要:我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为
了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的
一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写
入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的
数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,
调用 flush(刷新)操作,将数据刷到设备中
    public static void main2(String[] args) {
        //按照字节来写文件
        try(OutputStream out = new FileOutputStream("D:\\.11111\\Demo\\as.txt")){
            out.write(97);
            out.write(98);
            out.write(99);
            out.write(100);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

按照字符读入

    public static void main1(String[] args) {
        try(Reader reader = new FileReader("D:\\.11111\\Demo\\as.txt")){
            //按照字符来读文件
            while (true) {
                char[] buffer = new char[1024];
                int len = reader.read(buffer);
                if (len==-1) {
                    break;
                }
//            for (int i = 0; i < len; i++) {
//                System.out.println(buffer[i]);
//            }
                String str = new String(buffer,0,len);
                System.out.println(str);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

按照字符写入

    //按照字符来写文件
    public static void main(String[] args) {
        try(Writer writer = new FileWriter("D:\\.11111\\Demo\\as.txt")){
            writer.write("qweq");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

实战用法

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

    //删除文件的操作
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要删除文件所存在的根路径");
        String root = scanner.next();
        System.out.println("请输入想要删除的文件名");
        String name = scanner.next();
        File file = new File(root);
        //如果当前文件不是目录
        if (!file.isDirectory()){
            System.out.println("您所输入的文件路径有误");
        }
        scannerDir(file,name);
    }

    private static void scannerDir(File root, String name) throws IOException {
        File[] files = root.listFiles();
        if (files==null) {
            return;
        }
        for (File file:files) {
            if (file.isFile()) {
                if (file.getName().contains(name)) {
                    deleteFile(file);
                }
            } else if (file.isDirectory()) {//如果当前的文件还是目录那就往下递归
                scannerDir(file,name);
            }
        }
    }

    private static void deleteFile(File file) throws IOException {
        System.out.println("是否确定要删除文件(Y/N):"+file.getCanonicalPath());
        Scanner scanner = new Scanner(System.in);
        String choice = scanner.next();
        if (choice.equals("Y")) {
            file.delete();
            System.out.println("文件删除成功");
        } else {
            System.out.println("删除失败");
        }
    }

进行普通文件的复制。

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入源文件的路径:");
        String src = scanner.next();
        System.out.println("请输入想要复制的文件所在的路径");
        String dest = scanner.next();
        File file = new File(src);
        if (!file.isFile()) {
            System.out.println("文件的路径不存在");
        }
        try(InputStream inputStream = new FileInputStream(src)) {
            try(OutputStream outputStream = new FileOutputStream(dest)){
                byte[] bytes = new byte[1024];
                int len = 0;
                while(true) {
                    len = inputStream.read(bytes);
                    if (len==-1) {
                        break;
                    }
                    outputStream.write(bytes,0,len);
                    System.out.println("复制完毕");
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

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

    //查找指定字符串所在的路径
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入根路径:");
        String src = scanner.next();
        System.out.println("请输入想要查找的字符串:");
        String str = scanner.next();
        File file = new File(src);
        if (!file.isDirectory()) {
            System.out.println("当前所在的路径不存在");
            return;
        }
        scannerDir(file,str);
    }

    private static void scannerDir(File file, String str) {
        File[] files = file.listFiles();//列出当前的目录
        if (files==null) {
            return;
        }
        for (File file1:files) {
            if (file1.isFile()) {
                //查找当前文本
                if (containStr(file1,str)) {
                    System.out.println(file1.getAbsoluteFile());
                }
            }else if (file.isDirectory()) {
                scannerDir(file1,str);
            }
        }
    }

    private static boolean containStr(File file1, String str) {
        StringBuilder stringBuilder = new StringBuilder();
        try(Reader reader = new FileReader(file1)) {
            char[] chars = new char[1024];
            while (true) {
                int len = reader.read(chars);
                if (len==-1) {
                    break;
                }
                stringBuilder.append(chars,0,len);

            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.indexOf(str)!=-1;
    }

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

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

相关文章

『分分钟玩转VueRouter●中』少开一把王者荣耀掌握VueRouter的基本使用

文章目录一、编程式路由导航二、缓存路由组件三、两个新的声明周期钩子四、路由守卫五、路由器的两种工作模式本篇博客会介绍Vue中的VueRouter的基本使用&#xff0c;编程式路由导航增加了我们进行路由跳转的灵活性&#xff0c;缓存路由组件保障了我们使用路由时的便捷性&#…

【高阶数据结构】搜索二叉树 经典习题讲解

&#x1f308;欢迎来到数据结构专栏~~搜索二叉树 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句…

【OpenFOAM】-olaFlow-算例6- waveFloatingObject

算例路径&#xff1a; olaFlow\tutorials\waveFloatingObject 算例描述&#xff1a; 波浪作用下的浮体的刚体运动&#xff0c;属于流固耦合&#xff08;FSI&#xff09;问题 学习目标&#xff1a; 动网格设置和使用&#xff0c;网格变形控制&#xff0c;浮体的物理参数设置&…

23种设计模式(二)——享元模式【对象性能】

文章目录意图什么时候使用享元享元模式的实现内部状态和外部状态享元模式的优缺点与其他模式的关系亦称&#xff1a; 缓存、Cache、Flyweight 意图 享元模式是一种结构型设计模式&#xff0c; 它摒弃了在每个对象中保存所有数据的方式&#xff0c; 通过共享多个对象所共有的相…

数图互通房产管理系统架构分析

数图互通高校房产管理系统V5.0 使用JAVA、Canvas、H5等技术开发的图形数据交互技术架构平台&#xff1b;本系统满足XX大学房屋管理系统需求&#xff0c;高校房产综合管理信息系统平台V5.0遵循高校房产“分级授权、分类管理、网络化、图形化、精细化、流程化”的管理理念&#x…

关于新冠的几点总结

关于新冠的几点总结一、前言:二、病程阶段1. 第一阶段 反复发热2. 第二极端 退烧虚弱3. 第三阶段 咳嗽嗜睡三、处置措施:1. 思想准备2. 药/物准备3. 退烧方式4. 保持体温5. 通则不痛&#xff0c;痛则不通6. 营养补充7. 恢复关键期写在最后一、前言: 所写内容&#xff0c;为个人…

磊科路由器后门蜜罐捕获的事件分布情况

重点物联网 漏洞利用情况本节我们选取了两个漏洞进行分析。UPnP 相关的漏洞我们将在 4.4.3 进行分析&#xff0c;除去 UPnP 相关漏 洞外&#xff0c;被利用最多的是 Eir D1000 路由器的一个漏洞 [44]&#xff08;CVE-2016-10372&#xff09;&#xff0c;我们将对其进行分析。 …

Apollo浅解2

目录 用户、角色、权限 三者间的关系 权限Permission 新增一个应用时 新增一个命名空间时 角色Role 新增一个应用时 新增一个命名空间时 第三方应用 用户、角色、权限 三者间的关系 apollo也采用经典的三层权限设计&#xff0c;用户关联角色&#xff0c;角色关联权限…

DOM基础

一、DOM的概念 文档对象模型(DOM,Document Object Module)是W3C组织推荐的处理可扩展标志语言的标准编程接口&#xff0c;它允许程序和脚本动态的访问和更新文档的内容、结构和样式。 HTML的DOM操作是将文档里所有的内容(包括标签、标签里的内容、标签属性甚至注释等)都当做一…

51单片机入门 第一篇:LED灯

文章目录前言一、LED原理图二、创建keil5工程三、代码的编写四、程序的烧录总结前言 本篇文章讲正式带大家开始学习51单片机&#xff0c;希望这些文章能够很好的帮助到大家学习51单片机。 一、LED原理图 一般的51单片机上都带有8个LED灯&#xff0c;这里8个LED灯分别接到了板…

JS逆向——工信部ICP、IP、域名信息备案管理平台

问题&#xff1a;&#xff08;1&#xff09;数据列表接口token参数验证&#xff08;2&#xff09;authKey参数加密生成 1、页面中请求接口&#xff0c;观察请求头可发现&#xff0c;校验参数token为加密的字符串&#xff0c;根据该字符串并不能直观得到所用的加密方式是什么。 …

数据库大小写不敏感后,值也不敏感了

现象&#xff1a;我有一个账号admin&#xff0c;结果莫名多了一个ADMIN、Admin、AdMin等一些列账号&#xff1b;细品你的密码就算密文签名&#xff0c;是不是在你不知情的情况下也有很多。 原因&#xff1a;数据库安装的时候设置的大小写不敏感导致 解决&#xff1a;建议第三…

Spark 的学习笔记

Spark 的学习笔记 文章目录Spark 的学习笔记1. 概述Spark 优势及特点优秀的数据模型和丰富计算抽象Spark 生态圈Spark 特点Spark 与 HadoopSpark与MRSpark Streaming与StormSpark SQL与HiveSpark 运行模式2. 快速入门使用 Spark Shell 进行交互式分析基础Dataset 上的更多操作缓…

【机器学习】LDA算法原理

问题 线性判别分析&#xff08;Linear Discriminant Analysis&#xff0c;LDA&#xff09;是机器学习中常用的降维方法之一&#xff0c;本文旨在介绍LDA算法的思想&#xff0c;其数学推导过程可能会稍作简化。 LDA的思想 ● LDA是一种线性的、有监督的降维方法&#xff0c;即…

销售流程标准化重要吗?

各行各业都存在销售&#xff0c;但并不是每个销售都可以成为优秀的销售&#xff0c;优秀的销售往往有一套完整的销售流程&#xff0c;为了保证销售新人销售工作的顺利进行&#xff0c;销售流程标准化很有必要。 前言 各行各业都存在销售&#xff0c;但并不是每个销售都可以成为…

前端面试题之计算机网络篇--WebSocket基本使用

WebSocket 普通的包的请求和响应过程 1. 对 WebSocket 的理解 WebSocket是HTML5提供的一种浏览器与服务器进行全双工通讯的网络技术&#xff0c;属于应用层协议。它基于TCP传输协议&#xff0c;并复用HTTP的握手通道。浏览器和服务器只需要完成一次握手&#xff0c;两者之间…

HDLBits练习汇总-13-时序逻辑设计测试--状态机(一)

简单摩尔状态机1&#xff08;Fsm1&#xff09; 是一个摩尔状态机&#xff0c;具有两种状态&#xff0c;一种输入&#xff0c;一种输出。实现此状态机。请注意&#xff0c;重置状态为 B。使用异步复位。 模块声明 module top_module(input clk,input areset, // Asynchrono…

基础数学复习(3)——曲线拟合

文章目录基础概念曲线拟合的流程极小化损失函数线性最小二乘超定方程组的最小二乘解&#xff08;必考&#xff09;例题&#xff08;必考&#xff09;使用法方程计算拟合方程使用最小二乘法求解总结基础概念 曲线拟合的流程 选取函数类选取参数的准则&#xff1a;极小化损失函…

实习-------数据库基础

检索数据 1、如果使用DISTINCT关键字&#xff0c;它必须直接放在列名的前面。不能部分使用DISTINCT&#xff0c;DISTINCT关键字应用于所有列而不仅是前置它的列 例如&#xff1a;SELECT DISTINCT vend_id告诉MySQL只返回不同&#xff08;唯一&#xff09;的vend_id行 2、带一…

(六)devops持续集成开发——jenkins的全局工具配置之node环境安装及配置

前言 本节内容主要是关于jenkins集成node组件&#xff0c;从而实现前端node项目的流水线CICD发布功能。我们需要先安装好前端组件node,并在jenkins中配置好node组件&#xff0c;这样就可以流水线发布一个前端工程了。 正文 安装node组件①上传node安装包 ②解压node安装包 t…