Java-File类详解(一篇讲透)

Posted _GGBond_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java-File类详解(一篇讲透)相关的知识,希望对你有一定的参考价值。

File类的使用



前言

本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!
也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,欢迎关注!

一、File类概述

(1) java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关

(2)File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。

(3) 想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。

(4) File对象可以作为参数传递给流的构造器,指明读取或写入的"终点"。

二、File类的使用

1. 绝对路径 vs 相对路径

(1)绝对路径:是一个固定的路径,从盘符开始
(2)相对路径:是相对于某个位置开始

  • main()方法中的相对路径是相对于当前工程
  • 单元测试方法中的相对路径是相对于当前模块

2. 路径分隔符

(1) 路径中的每级目录之间用一个路径分隔符隔开。

(2)路径分隔符和系统有关:

  • windowsDOS系统默认使用"\\"来表示
  • UNIX和URL使用"/"来表示

(3) Java程序支持跨平台运行,因此路径分隔符要慎用。
为了解决这个隐患,File类提供了一个常量:
public static final String separator:根据操作系统,动态的提供分隔符。

File file1 = new File("d:\\\\atguigu\\\\info.txt");
File file2 = new File("d:" + File.separator + "atguigu" + File.separator + "info.txt");
File file3 = new File("d:/atguigu");

3. 静态成员变量

静态成员变量描述
public static String pathSeparator系统中多个路径的分隔符 windows;
public static String separator系统中一个路径中多个名称之间的分隔符号 windows\\

3. 常用构造器

构造器描述
public File(String pathname)pathname为路径创建File对象,可以是绝对路径或者相对路径,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。
public File(String parent,String child)parent为父路径,child为子路径创建File对象。
public File(File parent,String child)根据一个父File对象和子文件路径创建File对象

代码演示:

//构造器1
        File file1 = new File("hello.txt");//相对于当前module
        File file2 =  new File("D:\\\\workspace_idea1\\\\JavaSenior\\\\day08\\\\he.txt");

        System.out.println(file1);
        System.out.println(file2);

        //构造器2:
        File file3 = new File("D:\\\\workspace_idea1","JavaSenior");
        System.out.println(file3);

        //构造器3:
        File file4 = new File(file3,"hi.txt");
        System.out.println(file4);
    

4. 常用方法

4.1 获取功能

方法描述
public String getAbsolutePath()获取绝对路径
public String getPath()获取路径
public String getName()获取名称
public String getParent()获取上层文件目录路径。若无,返回null
public long length()获取文件长度(即:字节数)。不能获取目录的长度。
public long lastModified()获取最后一次的修改时间,毫秒值
public String[] list()获取指定目录下的所有文件或者文件目录的字符串数组
public File[] listFiles()获取指定目录下的所有文件或者文件目录的File对象数组

代码演示:

    @Test
    public void test2()
        File file1 = new File("hello.txt");
        File file2 = new File("d:\\\\io\\\\hi.txt");

        System.out.println(file1.getAbsolutePath());
        System.out.println(file1.getPath());
        System.out.println(file1.getName());
        System.out.println(file1.getParent());
        System.out.println(file1.length());
        System.out.println(new Date(file1.lastModified()));

        System.out.println();

        System.out.println(file2.getAbsolutePath());
        System.out.println(file2.getPath());
        System.out.println(file2.getName());
        System.out.println(file2.getParent());
        System.out.println(file2.length());
        System.out.println(file2.lastModified());
    
    @Test
    public void test3()
        File file = new File("D:\\\\workspace_idea1\\\\JavaSenior");

        String[] list = file.list();
        for(String s : list)
            System.out.println(s);
        

        System.out.println();

        File[] files = file.listFiles();
        for(File f : files)
            System.out.println(f);
        

    

4.2 重命名功能

方法描述
public boolean renameTo(File dest)把文件重命名为指定的文件路径

代码演示:

 @Test
    public void test4()
        File file1 = new File("hello.txt");
        File file2 = new File("D:\\\\io\\\\hi.txt");

        boolean renameTo = file2.renameTo(file1);
        System.out.println(renameTo);

    

4.3 判断功能

方法描述
public boolean isDirectory()判断是否是文件目录
public boolean isFile()判断是否是文件
public boolean exists()判断是否存在
public boolean canRead()判断是否可读
public boolean canWrite()判断是否可写
public boolean isHidden()判断是否隐藏

代码演示:

  @Test
    public void test5()
        File file1 = new File("hello.txt");
        file1 = new File("hello1.txt");

        System.out.println(file1.isDirectory());
        System.out.println(file1.isFile());
        System.out.println(file1.exists());
        System.out.println(file1.canRead());
        System.out.println(file1.canWrite());
        System.out.println(file1.isHidden());

        System.out.println();

        File file2 = new File("d:\\\\io");
        file2 = new File("d:\\\\io1");
        System.out.println(file2.isDirectory());
        System.out.println(file2.isFile());
        System.out.println(file2.exists());
        System.out.println(file2.canRead());
        System.out.println(file2.canWrite());
        System.out.println(file2.isHidden());

    

4.4 创建功能

方法描述
public boolean createNewFile()创建文件。若文件存在,则不创建,返回false
public boolean mkdir()创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
public boolean mkdirs()创建文件目录。如果上层文件目录不存在,一并创建

注意事项: 如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。

代码演示:

  @Test
    public void test6() throws IOException 
        File file1 = new File("hi.txt");
        if(!file1.exists())
            //文件的创建
            file1.createNewFile();
            System.out.println("创建成功");
        else//文件存在
            file1.delete();
            System.out.println("删除成功");
        


    
    @Test
    public void test7()
        //文件目录的创建
        File file1 = new File("d:\\\\io\\\\io1\\\\io3");

        boolean mkdir = file1.mkdir();
        if(mkdir)
            System.out.println("创建成功1");
        

        File file2 = new File("d:\\\\io\\\\io1\\\\io4");

        boolean mkdir1 = file2.mkdirs();
        if(mkdir1)
            System.out.println("创建成功2");
        
        //要想删除成功,io4文件目录下不能有子目录或文件
        File file3 = new File("D:\\\\io\\\\io1\\\\io4");
        file3 = new File("D:\\\\io\\\\io1");
        System.out.println(file3.delete());
    

4.5 删除功能

方法描述
public boolean delete()删除文件或者文件夹

注意事项: Java中的删除不走回收站。 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。

三、练习

1. 显示文件及文件夹内容

public static void showDir(File srcDir,int count) 
    System.out.println("|-" + srcDir.getName());
    File[] files = srcDir.listFiles();
    count++;
    for (File file : files) 
        System.out.print(printTab(count));
        if (file.isFile()) 
            System.out.println("|-" + file.getName());
         else 
            showDir(file,count);
        
    
	

2. 统计文件夹大小

public static long calculateDirSize(File srcDir) 
    long size = 0;
    File[] files = srcDir.listFiles();
    for (File file : files) 
        if (file.isDirectory()) 
            size += calculateDirSize(file);
         else 
            size += file.length();
        
    
    return size;

3. 复制文件夹

	//使用 commons-io-2.11.0包的工具类,工具类忒好了
    public static void copyDirUtil(File srcDir, File desDir) throws IOException 
        FileUtils.copyDirectory(srcDir, desDir); //底层也用的递归
    
	
	//自己递归实现
    public static void copyDir(File srcDir, File desDir) throws IOException 
        if (!desDir.exists()) 
            desDir.mkdir();
        
        File newDir = new File(desDir, srcDir.getName());
        newDir.mkdir();

        File[] files = srcDir.listFiles();
        if (files == null || files.length == 0) 
            return;
        
        for (File file : files) 
            if (file.isDirectory()) 
                copyDir(file, newDir);
             else 
                FileInputStream fis = new FileInputStream(file);
                FileOutputStream fos = new FileOutputStream(new File(newDir, file.getName()));
                byte[] buffer = new byte[1024];
                int len = 0;
                while ((len = fis.read(buffer)) != -1) 
                    fos.write(buffer, 0, len);
                
                fis.close();
                fos.close();
            
        
    


4. 剪切文件夹

	//使用 commons-io-2.11.0包的工具类,工具类忒好了
    public static void cutDirUtil(File srcDir, File desDir) throws IOException 
        FileUtils.moveDirectory(srcDir,desDir);
        /*源码
			先复制,再删除
		*/
    
    //自己实现,在复制后紧接着删除源文件
    public static void cutDir(File srcDir, File desDir) throws IOException 
        if (!desDir.exists()) 
            desDir.mkdir();//删除源文件夹
        
        File newDir = new File(desDir, srcDir.getName());
        newDir.mkdir();

        File[] files = srcDir.listFiles();
        if (files == null || files.length == 0) 
            srcDir.delete();
            return;
        
       for (File file : files) 
            if (file.isDirectory()) 
                cutDir(file, newDir);
             else 
                FileInputStream fis = new FileInputStream(file);
                FileOutputStream fos = new FileOutputStream(new File(newDir, file.getName()));
                byte[] buffer = new byte[1024];
                int len = 0;
                while ((len = fis.read(buffer)) != -1) 
                    fos.write(buffer, 0, len);
                
                fis.close();
                fos.close();
                //读写完后,删除源文件
                file.delete();
            
        
        srcDir.delete();
    


5. 删除文件夹

public static boolean deleteDir(File srcDir) 
    File[] files = srcDir.listFiles();
    if (files == null || files.length == 0) 
        return srcDir.delete();
    

    for (File file : files) 
        if (file.isDirectory()) 
            deleteDir(file);
         else 
            file.delete();
        
    
    return srcDir.delete();


6. 复制指定类型文件

	//将符合条件的 文件路径-文件名 存到map集合中
    public static Map<File, String> serchTypeFile(File srcDir, String desFileSuffix) 
        Map<File, String> map = new HashMap<>()

一篇讲透图表操作:趋势类&比较类&占比类&分布类图表

趋势类图表

在某些分类中,趋势类图表也被归为比较类图表,因趋势实际上就是现在与过去的比较。但此处我们将趋势类图表单独列出,同时将比较类图表定义为不同类别之间的对比,而不包括趋势类对比。

主要包括的图表如下:

从个人喜好上来讲,在描述趋势的时候,我比较喜欢用折线图。但折线图有个问题,就是一旦折线数量过多,图表的可读性会变得很差。一般这种情况下,我要么削减折线数量,要么就突出显示拟关注的重点。

但选择是使用折线图还是普通柱形图,需要区分情况。一般来说,如果图表中只有不到10个点,那就可以使用柱形图。如果图表中需要展示20个点以上的数据,则最好使用折线图。

普通柱形图在描述趋势的时候,要考虑到美观因素。通常柱形图之间的距离要比柱的宽度小,这样比较美观。另外由于柱形图既可以用于比较,也可以用于趋势,故需要做好区分。

在普通面积图上,需要控制面积线的数量。如果面积线超过了5条,那就选择4条重要的,然后将其余的归入其他的范畴,这样可以使图形简化。

比较类图表

比较类图表,主要指的是用于不同类别之间比较的图表。主要包括以下图表:

柱形图由于内容较多&#

以上是关于Java-File类详解(一篇讲透)的主要内容,如果未能解决你的问题,请参考以下文章

一篇讲透图表操作:趋势类&比较类&占比类&分布类图表

一篇讲透前端开发所需网络知识

Java-File类

java-File类-字节流

三天讲透SpringBoot-初识基础使用

《保姆系列五》三分钟讲透JavaIO,学妹看完直说牛逼!!!

(c)2006-2024 SYSTEM All Rights Reserved IT常识