首页 > 编程语言 >JavaSE 面向对象程序设计 文件File 介绍练习加千行代码详解

JavaSE 面向对象程序设计 文件File 介绍练习加千行代码详解

时间:2024-05-30 12:04:03浏览次数:22  
标签:千行 System 文件夹 File import new JavaSE public

介绍

在Java中,File类是用于表示文件和目录路径的抽象。它提供了一组方法来创建、删除、重命名、检查文件/目录的存在性、以及查询文件/目录的属性等功能。File类可以用于执行文件系统操作,如创建新文件、删除文件、检查文件是否存在等。

目的是

把字符串先表示为路径

然后转化成File对象

去调用里面的方法

通过父级路径和子级路径拼接的方法

或者是

\ 在Java里是转义字符

字符串和文件拼接

小结

File对象表示路径,可以是文件,也可以是文件夹

这个路径是可以存在的,也可以是不存在的

绝对路径是带盘符的

相对路径是不带盘符的,默认到当前项目下去寻找

常见的成员方法

判断和获取

提前创建了文件

三步走

判断是否存在

判断是否为文件

判断是否为文件夹

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        //对文件进行判断
        File f1=new File("E:\\新建文件夹\\新建文本文档.txt");

        System.out.println(f1.exists());
        //判断f1文件夹是否存在

        System.out.println(f1.isDirectory());
        //如果f1是文件夹方法返回值是true

        System.out.println(f1.isFile());
        //如果f1是文件方法返回值是true

        
        //对文件夹进行判断
        File f2=new File("E:\\新建文件夹\\新建文件夹");
        System.out.println(f2.exists());//true
        System.out.println(f2.isDirectory());//true
        System.out.println(f2.isFile());//false

        
        //如果文件不存在
        File f3=new File("E:\\新建文件夹\\我不存在");
        System.out.println(f3.exists());//false
        System.out.println(f3.isDirectory());//false
        System.out.println(f3.isFile());//false
    }
}

返回文件的大小 单位是字节

不能获取文件夹的大小,返回的结果和硬件有关

如果我们要获取一个文件夹的大小

需要把这个文件夹里的所有文件大小都累加到一起

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        File f1=new File("E:\\新建文件夹\\新建文本文档.txt");
        File f2=new File("E:\\新建文件夹\\新建文件夹");

        //返回文件的大小(字节数量)
        System.out.println(f1.length());

        //返回文件夹的大小(获取到的是0,因为length方法只能获取文件的大小)
        System.out.println(f2.length());
        
    }
}

获取文件的绝对路径

如果文字前写了模块名

会进行两次查找,即在当前项目下先寻找模块,在寻找文件

不写的话会在当前模块下直接寻找文件

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        File f1=new File("E:\\新建文件夹\\新建文本文档.txt");
        File f2=new File("文字.txt");

        //获取文件的绝对路径
        System.out.println(f1.getAbsolutePath());
        System.out.println(f2.getAbsolutePath());
    }
}

获取定义文件对象使用的路径

获取创建File对象时,括号里写的东西

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        File f1=new File("E:\\新建文件夹\\新建文本文档.txt");
        File f2=new File("文字.txt");

        //获取定义文件时使用的路径
        System.out.println(f1.getPath());
        System.out.println(f2.getPath());
    }
}

获取文件名称

扩展名,后缀名也会显示

但如果是文件夹,只会返回文件夹的名字,而不会返回后缀名,扩展名

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        File f1=new File("E:\\新建文件夹\\新建文本文档.txt");
        File f2=new File("文字.txt");

        //获取名称
        System.out.println(f1.getName());
        System.out.println(f2.getName());
    }
}

返回文件的最后修改时间

获取的是时间的毫秒值

还是要把他变成字符串表示的时间 yyyy年MM月dd日

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        File f1=new File("E:\\新建文件夹\\新建文本文档.txt");
        File f2=new File("文字.txt");

        //获取最后一次修改时间的毫秒值
        System.out.println(f1.lastModified());
        System.out.println(f2.lastModified());
    }
}

拓展 把毫秒值转换成表示的时间

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        File f1=new File("文字.txt");

        //获取毫秒值
        System.out.println(f1.lastModified());

        long time=f1.lastModified();

        //获得Date对象
        Date date=new Date(time);

        //获取SimpleDateFormat对象
        //可以解析时间变成我们自己喜欢的格式
        //先写解析式
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM--dd HH:mm:ss");

        //把参数传进去,获得字符串
        String t=sdf.format(date);

        System.out.println(t);

    }
}

获取并遍历

最重要的一个方法

获取文件夹里面所有的内容 包括:文件 文件夹 隐藏的文件

把内容放到数组中进行返回 这个数组是file类型的数组

import java.io.File;

public class Main {
    public static void main(String[] args) {
        File f=new File("D:\\新建文件夹");
        File file[]=f.listFiles();
        for (File file : file) {
            //file表示文件夹里的每一文件或者文件夹
            System.out.println(file);
        }
    }
}

当调用者File表示的路径不存在的时候 返回null

当调用者File表示的路径是文件时 返回null

当调用者File表示的路径是一个空文件夹时 返回一个长度为0的数组

当调用者File表示的路径是一个有内容的文件夹时 将里面的所有文件和文件夹的路径放到File数组中进行返回

当调用者File表示的路径是一个有隐藏文件的文件夹时 将里面的所有文件和文件夹的路径房贷File数组中返回 包括隐藏文件

当调用者File表示的路径是需要权限才能访问的文件夹时 返回null

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;

public class Main {
    public static void main(String[] args) {
        File f=new File("D:\\新建文件夹");

        //遍历盘符
        File arr1[]=File.listRoots();
        for(File f1:arr1) System.out.println(f1);


        /*-----------------------------------------*/
        //获取当前路径下所有的内容 带拓展名
        String arr2[]=f.list();
        for(String str:arr2) System.out.println(str);


        /*-----------------------------------------*/
        //利用文件名过滤器获取当前路径下所有的内容
        String arr3[]=
        f.list(new FilenameFilter() {
            @Override
            //形参表示文件夹里每一个文件或者文件夹的路径
            public boolean accept(File dir, String name) {
                File src=new File(dir,name);
                //返回值表示当前路径是否保留 保留为true 不保留为false
                return src.isFile()&&name.endsWith(".txt");
            }
        });
        for(String str:arr3) System.out.println(str);

        //转化成Lambda表达式
        f.list((dir, name) -> {
            File src=new File(dir,name);
            return src.isFile()&&name.endsWith(".txt");
        });


        /*-----------------------------------------*/
        File arr4[]=f.listFiles(new FileFilter() {
            @Override
            //形参是完整的每一个文件或者文件夹的路径
            public boolean accept(File pathname) {
                return true;
            }
        });

        //转化成Lambda表达式
        File arr5[]=f.listFiles(pathname -> true);


        /*-----------------------------------------*/
        File arr6[]=f.listFiles(new FilenameFilter() {
            @Override
            //第一个形参表示父级路径 第二个形参表示子级路径
            public boolean accept(File dir, String name) {
                return false;
            }
        });

        //第一个形参表示父级路径 第二个形参表示子级路径
        File arr7[]=f.listFiles((dir, name) -> name.endsWith(".txt"));

    }
}

创建文件夹

要求在当前文件夹下创建一个a.txt文件

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        File f=new File("D:\\新建文件夹");
        //如果文件已经存在,则创建失败
        f.mkdirs();
        File src = new File(f,"a.txt");
        boolean b=src.createNewFile();
        if(b) System.out.println("创建成功");
        else System.out.println("文件已经存在,创建失败");
    }
}

单个文件夹查找文件

查找某一个文件夹中,是否有txt结尾的文本文档

import java.io.File;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        File f=new File("D:\\新建文件夹");
        System.out.println(have(f));
    }
    public static boolean have(File file){
        //进入文件夹,获取里面的所有内容
        File file1[]=file.listFiles();
        //遍历数组获取里面的每一个元素
        for (File f : file1) {
            //f依次表示文件夹里每一个文件或者是文件夹路径
            if(f.isFile()&&f.getName().endsWith(".txt"))
                return true;
        }
        return false;
    }
}

多个文件夹查找文件

找到电脑中所有以avi结尾的电影

搜索所有盘符 要考虑子文件夹

把大问题拆分,拆到某一个文件夹不包含其他文件夹为止

用递归来实现

找到子文件夹了就再扔到递归里面

import java.io.File;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        //将盘符获取到数组里
        File arr[]=File.listRoots();
        //通过增强for循环来将数组里的每一个文件对象作为参数传入find函数
        for (File f:arr)find(f);
    }

    public static void find(File file){
        //进入文件夹,获取里面的所有内容
        File file1[]=file.listFiles();
        //判断文件夹是否为空 如果不是空文件夹则进入
        if (file1!=null){
            //遍历文件夹
            for(File f:file1){
                //如果是文件
                if(f.isFile()){
                    //获取文件名并进行判断
                    String name=f.getName();
                    if(name.contains(".txt"))
                        System.out.println(f);
                }
                //如果是文件夹 采用递归的方式
                else {
                    find(f);
                }
            }
        }
    }
}

删除一个多级文件夹

如果我们要删除一个有内容的文件

先删除一个文件夹里的所有内容

再删除自己

其中删除不了无法直接删除的内容(在其他文件中已打开或是没有访问权限等等)

import java.io.File;

public class Main {
    public static void main(String[] args) {
        File file=new File("D:\\新建文件夹");
        delete(file);
    }
    public static void delete(File src){
        //把文件夹内部所有的文件和文件夹放到数组里面去
        File files[]=src.listFiles();
        //遍历每一个文件
        for(File file:files){
            if(file.isFile())//如果是文件,直接删除
                file.delete();
            else delete(file);//如果是文件夹,递归
        }
        src.delete();
    }
}

统计文件夹的大小

统计一个文件夹的总大小

文件夹的总大小说白了就是文件夹里所有文件的大小

import java.io.File;
import java.util.GregorianCalendar;

public class Main {
    //public static long len=0;//定义在外面

    public static void main(String[] args) {
        File file=new File("D:\\新建文件夹");
        System.out.println(getlen(file));
    }
    public static long getlen(File src){
        long len=0;
        //定义变量进行累加
        //得到每一个文件夹
        File files[]=src.listFiles();
        for(File file:files){
            if(file.isFile())
                //如果是文件累加
                len+=file.length();
            else
                //如果是文件夹,递归
                len+=getlen(file);
        }
        return len;
    }
}

统计每种文件的个数

考虑子文件夹

File 递归 Map集合

写一个方法

参数是要统计的那个文件夹

返回值是用来统计map集合的

键:后缀名

值:出现次数

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        File file=new File("D:\\新建文件夹");
        HashMap<String,Integer>hm=getCount(file);
        System.out.println(hm);
    }
    public static HashMap<String,Integer> getCount(File src){

        HashMap<String,Integer>hm=new HashMap<>();
        //定义集合来统计

        File[] files=src.listFiles();
        //进入文件夹src

        for(File file:files){
            //如果是文件,进行统计
            if(file.isFile()){
                String name=file.getName();
                String arr[]=name.split("\\.");
                if(arr.length>=2){
                    String endName=arr[arr.length-1];
                    if(hm.containsKey(endName)){
                        //存在
                        int count=hm.get(endName);//把值拿出来
                        count++;//自增
                        hm.put(endName,count);//再放回去
                    }
                    else {
                        //第一次出现
                        hm.put(endName,1);
                    }
                }
            }
            else {
                //如果是文件夹,进行递归 自己调用自己
                HashMap<String,Integer>sonMap=getCount(file);
                //sonMap是子文件夹中每一种文件的个数
                //遍历sonMap把里面的数值都累加到hm当中
                Set<Map.Entry<String,Integer>>entries=sonMap.entrySet();
                for (Map.Entry<String, Integer> entry : entries) {
                    //获取键值对对象
                    String key=entry.getKey();
                    int value=entry.getValue();
                    if(hm.containsKey(key)){
                        //存在
                        int count=hm.get(key);//count是从hm获取出来的数值
                        count+=value;//value是从sonMap中获取出来的值
                        hm.put(key,count);//放进去,覆盖
                    }
                    else{
                        //不存在
                        hm.put(key,value);
                    }
                }
            }
        }
        return hm;
    }
}

标签:千行,System,文件夹,File,import,new,JavaSE,public
From: https://blog.csdn.net/qq_30500575/article/details/139236954

相关文章

  • Linux顶层 Makefile 详解
    makefile分析:分析linuxmakefile文件时候我们需要在vscode下设置屏蔽下不用的文件夹。具体来说可以先建立一个.vscode文件夹和setting.json。具体内容为:{"search.exclude":{"**/node_modules":true,"**/bower_components":true,"**/*.o":true,"**/*......
  • 尽管依赖行者未找到任何缺失的依赖项,但在尝试使用 Ctypes 加载 DLL 时仍出现 FileNotF
    答案:设置winmode=0我是第一次使用ctypes,因此在尝试真正实现它之前先玩了一下。但是,我无法使用ctypes.CDLL()加载我编译的DLL,因为它会抛出FileNotFoundError。这是完整的错误信息:FileNotFoundError:无法找到模块'E:\absolute\path\to.dll'(或其依赖项之一)。请尝试使用带有构......
  • 初识dockerfile
     dockerfile就是用来构建docker镜像的构建文件!命令脚本!先体验一下!通过这个脚本可以生成镜像,镜像是一层一层,脚本一个个的命令,每个命令都是一层!#创建一个dockerfile文件,名字可以随机,建议dockerfile#文件中的内容指令(大写)参数[root@localhosthome]#mkdirdocker-test-volume......
  • error Conflict: Multiple assets emit different content to the same filename ind
    ERRORFailedtocompilewith1error20:32:04errorConflict:Multipleassetsemitdifferentcontenttothesamefilenameindex.htmlERRORinConflict:Multipleassetsemitdif......
  • filebeat配置参数add_kubernetes_metadata
    在Kubernetes集群中,我们可以使用Filebeat来从容器中收集日志,并为每个日志事件添加Kubernetes相关的元数据信息,例如Pod名称、命名空间、标签等。这样我们就可以更好地分析和理解日志数据。filebeat.inputs:-type:containerpaths:-/var/log/containers/*.log......
  • (附nuclei yaml文件)泛微E-office 10 atuh-filephar反序列化命令执行漏洞复现(QVD-2024-1
    (附nucleiyaml文件)泛微E-office10atuh-filephar反序列化命令执行漏洞复现(QVD-2024-11354)声明本文仅用于技术交流,请勿用于非法用途由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。1、漏洞简介泛......
  • Dockerfile - 参数与详解
    只有FROM时必须的#在当前路径下构建test镜像,执行Dockerfile文件dockerbuild-ttest.1.FROM制定基于那个镜像进行构建FROMalpine:latest2.WORKDIR指定工作目录,执行shell脚本的工作目录WORKDIR/app3.COPYADD复制文件,将宿主机文件拷贝到镜像中ADD可以是网络资......
  • 使用Dockerfile部署go项目
    主旨就是先拉代码,再删旧容器和镜像,再起Dockerfile的容器并执行出go的二进制文件,再运行Dockerfile文件如下FROMgolang:alpine#为我们的镜像设置必要的环境变量ENVGO111MODULE=on\GOPROXY=https://goproxy.cn,direct\CGO_ENABLED=0\GOOS=linux\GO......
  • Docker_Dockerfile5
    一、Docker镜像原理思考:Docker镜像本质是什么?Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB? 操作系统组成部分:进程调度子系统进程通信子系统内存管理......
  • DockerDesktop中启动jenkins容器时提示:Can not write to /var/jenkins_home/copy_ref
    场景Windows10(家庭版)中DockerDesktop(docker)的配置、安装、修改镜像源、使用:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/139264096按照以上教程搭建之后想要运行jenkins容器,所以执行如下指令dockerrun-d--namejenkins-p18088:8080-v/jenkinshome:......