码字不易,三连支持一波吧

IO操作向来是各大语言的热区,而对文件的操作也是重中之重。
那么在Java中也给我们提供了很多关于文件操作的类。今天我就用一个比较基本的File类来模拟实现对文件的增删改查效果。
这里先解释一下,何谓增删改查:

  • :创建一个文件(可以是目录,可以是文件)
  • :删除指定文件或文件夹(非空)
  • :对文件重命名,这里我加以拓展,也可以实现对文件的移动
  • :遍历并统计指定目录下(包含其子目录)指定类型文件的个数,如某目录中共包含.java文件23个,以及修改日期,几行代码文字; 列出给定目录中,所有文件类型的文件个数,以及文件类型个数,以及总类型个数和总文件个数

那么废话不多说,直接开始:

步骤定位

要实现创建文件还是比较简单的:

package day_12_13.zuoye;

import java.io.File;
import java.io.IOException; /**
* @author soberw
* @Classname AddFile
* @Description 创建文件或者目录
* @Date 2021-12-13 18:57
*/
public class AddFile {
public static void main(String[] args) {
//创建目录
File file = new File("d:/hello/abc");
if (!file.exists()) {
file.mkdirs();
System.out.println("创建成功!");
}
//在刚创建的目录中在创建一个文件
File file1 = new File("d:/hello/abc/hello.txt");
try {
file1.createNewFile();
} catch (IOException e) {
System.out.println("创建失败!");
}
}
}


删除指定文件或文件夹(非空)。
如果是空文件夹或者文件,那就比较简单,以刚才添加的文件为例,现在我想删除hello.txt,实现如下:

 if (file1.exists()) {
file1.delete();
System.out.println("删除成功!");
}



这当然很简单,但delete()有个缺陷,就是只能删除空目录或者单个文件,现在我想删除的目录里面存放的有文件,还有子目录,这怎么办,这里我用了递归去实现,一层一层找,一层一层删:
例如我要删除一个aaa的文件夹,其结构如下(可以说很复杂了)。

代码如下(注意我此时的文件路径在E:\\HelloJava\\Java_Study_Beiyou\\aaa):

package day_12_13.zuoye;

import java.io.File;

/**
* @author soberw
* @Classname DeleteFile
* @Description 删除非空目录
* @Date 2021-12-13 11:32
*/
public class DeleteFile {
public static void main(String[] args) {
File file = new File("E:\\HelloJava\\Java_Study_Beiyou\\aaa");
deleteFile(file);
} public static void deleteFile(File file) {
if (file.exists()) {
File[] files = file.listFiles();
if (files != null) {
if (files.length == 0) {
file.delete();
} else {
for (File f : files) {
deleteFile(f);
}
}
}
}
file.delete();
}
}

此时再我再打开:

已经没有aaa这个文件夹了,证明删除成功!

对文件或者文件夹重命名,这里我在以一个文件为例,其路径为:D:\hello\abc\soberw.txt

现在我想将他更名为sober.txt
实现如下:

package day_12_13.zuoye;

import java.io.File;

/**
* @author soberw
* @Classname UpdateFile
* @Description 对文件名进行修改操作
* @Date 2021-12-13 20:14
*/
public class UpdateFile {
public static void main(String[] args) {
File file = new File("D:\\hello\\abc\\soberw.txt");
File newFile = new File("D:\\hello\\abc\\sober.txt");
if (file.exists()) {
file.renameTo(newFile);
}
}
}


这就实现了,其实就是用的renameTo()方法,但是如果是这样那就太简单了,其实深挖一下,renameTo()方法还有很多用途:
例如:我想将一个文件移动到另一个文件下,并重命名,我可以这样做:

public static void main(String[] args) {
File file = new File("D:\\hello\\abc\\soberw.txt");
File newFile = new File("D:\\hello\\abc\\sober.txt");
if (file.exists()) {
file.renameTo(newFile);
}
File moveFile = new File("D:\\aaa\\bbb\\ccc.txt");
if(file.getParentFile().exists()){
newFile.renameTo(moveFile);
}
}


也可以修改文件夹名称:比如我想将上面的bbb文件夹修改为abc,实现如下:

        File files = new File("D:\\aaa\\bbb");
files.renameTo(new File("D:\\aaa\\abc"));


这里顺便总结一下renameTo()方法的用法:

  1. 同一路径下文件重命名【文件重命名】
  2. 第将文件从一个路径移动另一个路径下,并且移动的文件进行重命名【文件移动重命名】
  3. 修改文件夹的名称

前面三个都还比较好实现,现在就剩检索了,现在我想列出指定目录下指定格式的所有文件,并附带修改时间,每个文件行数,如何实现呢?我以.java文件为例,这里我用到了递归

package day_12_13.zuoye;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Objects; /**
* @author soberw
* @Classname CountFile
* @Description 递归统计某目录中有多少java文件?每个Java文件中有多少行代码,总有多少行代码
* @Date 2021-12-13 16:17
*/
public class CountFile {
//统计个数
public static int count = 0;
//统计行数
public static int lines = 0; public static void main(String[] args) throws IOException {
countJavaFile(new File("E:\\HelloJava\\Java_Study_Beiyou"));
//countJavaFile(new File("G:\\"));
System.out.printf("共%d个java文件,共%d行代码", count, lines);
} public static void countJavaFile(File file) throws IOException {
if (file.exists()) {
if (file.isFile() && file.getName().endsWith(".java")) {
count++;
//读取出来但是会报错,不稳定,不推荐
//int line = Files.readAllLines(Path.of(file.getPath())).size(); //稳定读取
long line = new BufferedReader(new FileReader(file)).lines().count();
lines += line;
System.out.printf("%s(%s)【%tF %<tT】共%d行\n", file.getParentFile(), file.getName(), file.lastModified(), line);
} else if (file.isDirectory() && file.list() != null) {
for (File listFile : Objects.requireNonNull(file.listFiles())) {
countJavaFile(listFile);
}
}
}
}
}

运行结果(太长了,这里我就截取一部分吧):

现在我不想指定文件类型了,我想让程序自己列出所有的类型,并统计个数,如何实现呢?
这里我用到了Map,同样还有递归,通过自己编写的CountFileType类实现:

package day_12_13.zuoye;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Set; /**
* @author soberw
* @Classname CountFileType
* @Description 递归统计某目录,并列出些目录中,某文件类型的文件个数?例如:包含.java文件30个,.jpg文件78个等
* @Date 2021-12-13 16:20
*/
public class CountFileType {
/**
* 声明一个Map存储文件类型及次数,key对应文件类型,value对应出现次数
*/
private static Map<String, Integer> map = new HashMap<>(); /**
* @description: 列出给定目录中,某文件类型的文件个数,以及文件类型个数
* @param str: 传入的路径
* @return: void
* @author: soberw
* @time: 2021/12/13 18:16
*/
public static void show(String str) {
File file = new File(str);
if (file.exists()) {
countFileType(file);
Set<String> keySet = map.keySet();
System.out.println("本目录下包含有:");
int count = 0;
for (String s : keySet) {
count += map.get(s);
System.out.printf("%s文件:%d个。\n", s, map.get(s));
}
System.out.printf("共%d种文件类型,共%d个文件。", keySet.size(), count);
}else {
System.out.println("请检查路径是否合法!");
}
} /**
* @param file 文件路径
* @description: 递归检索目录,获取文件名后缀并存入map中,value会自增一
* @return: void
* @author: soberw
* @time: 2021/12/13 18:17
*/
private static void countFileType(File file) {
if (file.exists()) {
if (file.isFile() && file.getName().contains(".")) {
String type = file.getName().substring(file.getName().lastIndexOf(".")).toLowerCase();
if (!map.containsKey(type)) {
map.put(type, 1);
} else {
if (map.get(type) != null) {
map.put(type, map.get(type) + 1);
}
}
} else if (file.isDirectory() && file.list() != null) {
for (File listFile : Objects.requireNonNull(file.listFiles())) {
countFileType(listFile);
}
}
}
}
}

测试如下(通过CountFileTypeTest类测试):

package day_12_13.zuoye;

/**
* @author soberw
* @Classname CountFileType
* @Description 对CountFileType的测试
* @Date 2021-12-13 16:20
*/
public class CountFileTypeTest {
public static void main(String[] args) {
CountFileType.show("E:\\\\HelloJava\\\\Java_Study_Beiyou");
}
}

结果如下:

用Java中的File类模拟实现对系统文件的增删改查效果的更多相关文章

  1. java中的File类

    File类 java中的File类其实和文件并没有多大关系,它更像一个对文件路径描述的类.它即可以代表某个路径下的特定文件,也可以用来表示该路径的下的所有文件,所以我们不要被它的表象所迷惑.对文件的真 ...

  2. 3.创建Manager类,演示对TestUser进行增删改查功能

    接上一篇文章 创建NHibernateHelper帮助类,生成sessionFactory http://www.cnblogs.com/fzxiaoyi/p/8443587.html 创建个新的类M ...

  3. magento中Model创建以及该Model对于数据库的增删改查

    本文是按照magento英文文档照做与翻译的. Model层的实现是mvc框架的一个巨大的部分.它代表了你的应用的数据,或者说大多数应用没有数据是无用的.Magento的Model扮演着一个重要的角色 ...

  4. 【温故知新】Java web 开发(四)JSTL 与 JDBC 的增删改查

    本篇开始使用 jstl 这个 jsp 的标签库,在同一个 Servlet 中实现处理 CRUD 请求,以及使用 jdbc 数据库基本操作.然后你会发现 Servlet 和 jdbc 还是有很多不方便之 ...

  5. SpringBoot+MyBatis中自动根据@Table注解和@Column注解生成增删改查逻辑

    习惯使用jpa操作对象的方式,现在用mybatis有点不习惯. 其实是懒得写SQL,增删改查那么简单的事情你帮我做了呗,mybatis:NO. 没办法,自己搞喽! 这里主要是实现了通过代码自动生成my ...

  6. 通过Java代码实现对数据库的数据进行操作:增删改查

    在写代码之前,依然是引用mysql数据库的jar包文件:右键项目-构建路径-设置构建路径-库-添加外部JAR 在数据库中我们已经建立好一个表xs :分别有xuehao  xingming    xue ...

  7. java单机操作redis3.2.10和集群操作增删改查

    先直接附上单机版的连接和增删改查,7000-7005是端口号 package com.yilian.util; import java.util.HashMap; import java.util.I ...

  8. Vue+Mock.js模拟登录和表格的增删改查

    有三类人不适合此篇文章: "喜欢站在道德制高点的圣母婊" -- 适合去教堂 "无理取闹的键盘侠" -- 国际新闻版块欢迎你去 "有一定基础但又喜欢逼逼 ...

  9. 【良心保姆级教程】java手把手教你用swing写一个学生的增删改查模块

    很多刚入门的同学,不清楚如何用java.swing去开发出一个系统? 不清楚如何使用java代码去操作数据库进行增删改查一些列操作,不清楚java代码和数据库(mysql.sqlserver)之间怎么 ...

随机推荐

  1. [学习笔记] RabbitMQ的简单使用

    安装依赖 # composer.json { "require": { "php-amqplib/php-amqplib": ">=2.9.0& ...

  2. STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解)

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) 前面 ...

  3. Jenkins_centos7安装jenkins(1)

    Jenkins自动化部署的流程 一.下载安装 下载安装JDK wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/j ...

  4. python 面向对象:多态和多态性

    很多人喜欢将多态与多态性二者混为一谈,然后百思不得其解,其实只要分开看,就会很明朗. 一.多态 多态指的是一类事物有多种形态.(一个抽象类有多个子类,因而多态的概念依赖于继承) 比如动物有多种形态:人 ...

  5. python的赋值、浅拷贝和深拷贝

    """ 一.赋值在python中就是简单的对象引用 """ list_a = ["aaa", "bbb&quo ...

  6. 利用python绘制分析路易斯安那州巴吞鲁日市的人口密度格局

    前言 数据来源于王法辉教授的GIS和数量方法,以后有空,我会利用python来实现里面的案例,这里向王法辉教授致敬. 绘制普查人口密度格局 使用属性查询提取区边界 import numpy as np ...

  7. 在字节,A/B 实验是这么做的!

    主要为大家介绍了为什么要做 A/B 测试.火山引擎的 A/B 测试系统架构及字节跳动内部 A/B 测试的最佳实践. 为什么要做 A/B 测试 首先我们看一个案例. 字节跳动有一款中视频产品叫西瓜视频, ...

  8. 《剑指offer》面试题41. 数据流中的中位数

    问题描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 例 ...

  9. 【刷题-LeetCode】200 Number of Islands

    Number of Islands Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. ...

  10. fiddler-ios13以上信任证书后无法抓取https包

    直接下载fiddler插件原始是不兼容https://telerik-fiddler.s3.amazonaws.com/fiddler/addons/fiddlercertmaker.exe