File类的使用
- 前言
 - 
- 一、File类概述
 - 二、File类的使用
 - 
- 1. 绝对路径 vs 相对路径
 - 2. 路径分隔符
 - 3. 静态成员变量
 - 3. 常用构造器
 - 4. 常用方法
 - 
- 4.1 获取功能
 - 4.2 重命名功能
 - 4.3 判断功能
 - 4.4 创建功能
 - 4.5 删除功能
 
 
 - 三、练习
 - 
- 1. 显示文件及文件夹内容
 - 2. 统计文件夹大小
 - 3. 复制文件夹
 - 4. 剪切文件夹
 - 5. 删除文件夹
 - 6. 复制指定类型文件
 
 
 
前言
本博主将用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)路径分隔符和系统有关:
windows和DOS系统默认使用"\"来表示- 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<>();
        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;
    }
    public static void copyTypeDir(File srcDir, File desDir, String desFileSuffix) throws IOException {
        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 = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS");
            String format = sdf.format(new Date());
            String s = names[0] + "(" + format + ")." + names[1];
            File file = new File(desDir, s);
            FileUtils.copyFile(key,file);
        }
    }
相关文章
暂无评论...
