0


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 =newFile("d:\\atguigu\\info.txt");File file2 =newFile("d:"+File.separator +"atguigu"+File.separator +"info.txt");File file3 =newFile("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

对象
代码演示:

//构造器1File file1 =newFile("hello.txt");//相对于当前moduleFile file2 =newFile("D:\\workspace_idea1\\JavaSenior\\day08\\he.txt");System.out.println(file1);System.out.println(file2);//构造器2:File file3 =newFile("D:\\workspace_idea1","JavaSenior");System.out.println(file3);//构造器3:File file4 =newFile(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对象数组
代码演示:

@Testpublicvoidtest2(){File file1 =newFile("hello.txt");File file2 =newFile("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(newDate(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());}@Testpublicvoidtest3(){File file =newFile("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)

把文件重命名为指定的文件路径
代码演示:

@Testpublicvoidtest4(){File file1 =newFile("hello.txt");File file2 =newFile("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()

判断是否隐藏
代码演示:

@Testpublicvoidtest5(){File file1 =newFile("hello.txt");
        file1 =newFile("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 =newFile("d:\\io");
        file2 =newFile("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()

创建文件目录。如果上层文件目录不存在,一并创建

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

代码演示:

@Testpublicvoidtest6()throwsIOException{File file1 =newFile("hi.txt");if(!file1.exists()){//文件的创建
            file1.createNewFile();System.out.println("创建成功");}else{//文件存在
            file1.delete();System.out.println("删除成功");}}@Testpublicvoidtest7(){//文件目录的创建File file1 =newFile("d:\\io\\io1\\io3");boolean mkdir = file1.mkdir();if(mkdir){System.out.println("创建成功1");}File file2 =newFile("d:\\io\\io1\\io4");boolean mkdir1 = file2.mkdirs();if(mkdir1){System.out.println("创建成功2");}//要想删除成功,io4文件目录下不能有子目录或文件File file3 =newFile("D:\\io\\io1\\io4");
        file3 =newFile("D:\\io\\io1");System.out.println(file3.delete());}}

4.5 删除功能

方法描述

public boolean delete()

删除文件或者文件夹

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

三、练习

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

3.

publicstaticvoidshowDir(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. 统计文件夹大小

publicstaticlongcalculateDirSize(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包的工具类,工具类忒好了publicstaticvoidcopyDirUtil(File srcDir,File desDir)throwsIOException{FileUtils.copyDirectory(srcDir, desDir);//底层也用的递归}//自己递归实现publicstaticvoidcopyDir(File srcDir,File desDir)throwsIOException{if(!desDir.exists()){
            desDir.mkdir();}File newDir =newFile(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 =newFileInputStream(file);FileOutputStream fos =newFileOutputStream(newFile(newDir, file.getName()));byte[] buffer =newbyte[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包的工具类,工具类忒好了publicstaticvoidcutDirUtil(File srcDir,File desDir)throwsIOException{FileUtils.moveDirectory(srcDir,desDir);/*源码
            先复制,再删除
        */}//自己实现,在复制后紧接着删除源文件publicstaticvoidcutDir(File srcDir,File desDir)throwsIOException{if(!desDir.exists()){
            desDir.mkdir();//删除源文件夹}File newDir =newFile(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 =newFileInputStream(file);FileOutputStream fos =newFileOutputStream(newFile(newDir, file.getName()));byte[] buffer =newbyte[1024];int len =0;while((len = fis.read(buffer))!=-1){
                    fos.write(buffer,0, len);}
                fis.close();
                fos.close();//读写完后,删除源文件
                file.delete();}}
        srcDir.delete();}

5. 删除文件夹

在这里插入图片描述

publicstaticbooleandeleteDir(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集合中publicstaticMap<File,String>serchTypeFile(File srcDir,String desFileSuffix){Map<File,String> map =newHashMap<>();File[] files = srcDir.listFiles();if(files ==null){return map;}for(File file : files){if(file.isDirectory()){
                map.putAll(serchTypeFile(file, desFileSuffix));}else{if(file.getName().toLowerCase().endsWith(desFileSuffix)){
                    map.put(file.getAbsoluteFile(), file.getName());}}}return map;}publicstaticvoidcopyTypeDir(File srcDir,File desDir,String desFileSuffix)throwsIOException{Map<File,String> map =serchTypeFile(srcDir, desFileSuffix);Set<Map.Entry<File,String>> entries = map.entrySet();for(Map.Entry<File,String> entry : entries){File key = entry.getKey();String value = entry.getValue();System.out.println(key +"---"+ value);/*挑选代码
                ...
            *///给文件加上时间戳,防止文件重名. //这里有点问题,时间戳到毫秒值,如果电脑够快,可能两个同名文件加的时间戳一样,会造成文件的覆盖,唉~~ //用(1)(2)的话,可以解决,但每次都要遍历新文件夹,好麻烦啊。String[] names = key.getName().split("\\.");//正则表达式的关系SimpleDateFormat sdf =newSimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS");String format = sdf.format(newDate());String s = names[0]+"("+ format +")."+ names[1];File file =newFile(desDir, s);FileUtils.copyFile(key,file);}}

本文转载自: https://blog.csdn.net/weixin_52533007/article/details/123274351
版权归原作者 小老师ir 所有, 如有侵权,请联系我们删除。

“Java-File类详解(一篇讲透)”的评论:

还没有评论