Java入门需要了解(IO流File对象-三十八)

InputStream 和 OutputStream 只能操作文件中的数据本身,但是操作不了文件本身的属性,也操作不了文件夹。

File概述

File 是文件和目录路径名的抽象表示形式
File 可以将一个已经存在或者不存在的文件或者目录封装成对象

文件的常用属性

  • 文件名称 file.getName()
  • 文件路径 file.getPath() / file.getAbsolutePath()
  • 文件大小 file.length()
  • 文件修改时间 file.lastModified()

import java.io.File;
import java.text.DateFormat;
import java.util.Date;

class FileTest {
    public static void main(String[] args) {
        File file = new File("file.txt");
        String fileName = file.getName();
        String path = file.getPath();//获取相对路径
        String fullPath = file.getAbsolutePath();//获取相对路径
        Long fileSize = file.length();//文件大小
        Long time = file.lastModified();//文件最后修改时间

        System.out.println("fileName = " + fileName);
        System.out.println("path     = " + path);
        System.out.println("fullPath = " + fullPath);
        System.out.println("fileSize = " + fileSize);
        System.out.println("time = " + time);
        //格式化一下文件最后的修改时间
        Date date = new Date(time);
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
        System.out.println("time = " + dateFormat.format(date));

    }

}

创建文件&删除文件

创建文件

创建一个新文件(如果文件不存在,则创建,如果存在则不创建)

  • createNewFile

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

/**
 * 创建一个新文件测试(如果文件不存在,则创建,如果存在则不创建)
 */
class CreateFileTest {
    public static void main(String[] args) throws IOException {
        File file = new File("newFile.txt");
        boolean createFlag = file.createNewFile();
        System.out.println("createFlag = " + createFlag);
    }
}

创建文件夹


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

/**
 * 创建文件夹测试
 */
class CreateDirTest {
    public static void main(String[] args) throws IOException {
        File file = new File("testDir");
        boolean createDirFlag = file.mkdir();
        System.out.println("createDirFlag = " + createDirFlag);
    }
}

创建多级目录

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

/**
 * 创建多级文件夹
 */
class CreateDirsTest {
    public static void main(String[] args) throws IOException {
        File file = new File("a\\b\\c\\d\\e\\f\\h\\i\\j\\k\\l\\m\\n");
        boolean createDirsFlag = file.mkdirs();
        System.out.println("createDirsFlag = " + createDirsFlag);
    }
}

删除文件

  • 删除一个文件(如果存在,并返回删除结果)

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

/**
 * 删除一个文件
 */
class DeleteFileTest {
    public static void main(String[] args) throws IOException {
        File file = new File("newFile.txt");
        boolean deleteFlag = file.delete();
        System.out.println("deleteFlag = " + deleteFlag);
    }
}

删除文件夹

删除文件夹时,文件夹需为空,否则删除失败。删除时直接删除,不会进入回收站。

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

/**
 * 删除文件夹
 */
class DeleteDirTest {
    public static void main(String[] args) throws IOException {
        File file = new File("testDir");
        boolean deleteDirFlag = file.delete();
        System.out.println("deleteDirFlag = " + deleteDirFlag);
    }
}

文件判断

判断文件是否存在

一般在对文件进行操作前,需要对文件进行此判断。

import java.io.File;

/**
 * 判断文件是否存在
 */
class FileIsTest {
    public static void main(String[] args) {
        File file = new File("newFile.txt");
        boolean flag = file.exists();
        System.out.println("flag = " + flag);
    }
}

文件的其他判断


import java.io.File;

/**
 * 判断文件是否存在
 */
class FileIsTest {
    public static void main(String[] args) {

        File file1 = new File("file.txt");
        System.out.println("file1----------------");
        System.out.println("isDirectory = " + file1.isDirectory());
        System.out.println("isFile = " + file1.isFile());

        File file2 = new File("a");
        System.out.println("file2----------------");
        System.out.println("isDirectory = " + file2.isDirectory());
        System.out.println("isFile = " + file2.isFile());

        File file3 = new File("abc");
        System.out.println("file3----------------");
        System.out.println("isDirectory = " + file3.isDirectory());
        System.out.println("isFile = " + file3.isFile());
    }
}

结果:
file1----------------
isDirectory = false
isFile = true
file2----------------
isDirectory = true
isFile = false
file3----------------
isDirectory = false
isFile = false

文件重命名


import java.io.File;

/**
 * 文件重命名
 */
class FileRenameTest {
    public static void main(String[] args) {

        File file = new File("file.txt");
        file.renameTo(new File("file_rename.txt"));

    }
}

获取系统所有根目录


import java.io.File;

/**
 * 列出系统所有根目录,并且打印出每个盘的总空间,已用空间,空闲空间
 */
class ListRootTest {
    public static void main(String[] args) {
        File[] rootList = File.listRoots();
        for(File file:rootList){
            System.out.println("file = " + file);
            //获取总空间
            System.out.println(file+" TotalSpace=" + file.getTotalSpace()/1024/1024/1024+"G");
             //获取已使用空间
            System.out.println(file+" UsableSpace=" + file.getUsableSpace()/1024/1024/1024+"G");
             //获取空闲空间
            System.out.println(file+" FreeSpace=" + file.getFreeSpace()/1024/1024/1024+"G");

        }
    }
}

获取目录内容

调用 list 的文件必须是目录,以及有访问权限的目录,否则返回空数组,从而引发 NullPointException 异常。


import java.io.File;

/**
 * 获取某个目录下的文件以及文件夹的名称
 */
class FileListTest {
    public static void main(String[] args) {
        File file = new File("c:\\");
        String[] fileList = file.list();
        for (String fileName: fileList) {
            System.out.println("fileName = " + fileName);
        }
    }
}

文件名过滤器

通过一个简单实现的过滤器来找到D盘下所有的.zip文件


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

/**
 * 过滤器的使用,找到D盘下的所有.zip文件
 */
class FilenameFilterTest {
    public static void main(String[] args) {
        File file = new File("D:\\");
        String[] fileList = file.list(new ZipFilenameFilter());
        for (String fileName: fileList) {
            System.out.println("fileName = " + fileName);
        }
    }
}

/**
 * 一个简单过滤器的实现,
 */
class ZipFilenameFilter implements FilenameFilter {
    @Override
    public boolean accept(File dir,String name) {
        return name.endsWith(".zip");
    }
}

文件过滤器

通过文件过滤器,可以根据文件的其他属性进行过滤,比如是否隐藏,大小,修改时间等。

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

/**
 * 通过文件过滤器获取文件列表
 */
class FileFilterTest {
    public static void main(String[] args) {
        File file = new File("D:\\");
        File[] files = file.listFiles(new ZipFileFilter());
        for (File fileItem: files) {
            System.out.println("fileItem = " + fileItem);
        }
    }
}

/**
 * 文件过滤器
 */
class ZipFileFilter implements FileFilter {

    @Override
    public boolean accept(File pathname) {
        return pathname.getName().endsWith(".zip");

    }
}

目录递归遍历

file.list() 或者 是 file.listFiles() 都只能列出当前目录下的文件或者文件夹。


import java.io.File;

/**
 * 遍历某个目录下所有的文件件和文件(使用递归)
 */
class FileTest {
    public static void main(String[] args) {
        listAll(new File("D:\\demo"));
    }

    public static void listAll(File dir) {
        //获取dir目录下面所有的文件和文件件
        File[] files = dir.listFiles();
        for (File file: files) {
            //如果文件本身是文件夹,则需要继续查找下面的内容
            if (file.isDirectory()) {
                //所以这里使用了递归,调用了自己。
                listAll(file);
            }
            System.out.println("file = " + file.getAbsolutePath());
        }
    }
}

目录递归遍历(缩进打印)

递归的使用参考准则:某个功能被重复使用,并且在使用时,参与运算的结果和上一次调用有关系。


import java.io.File;

/**
 * 遍历某个目录下所有的文件件和文件(使用递归)
 */
class FileTest2 {
    public static void main(String[] args) {
        listAll(new File("D:\\demo"),0);
    }

    public static void listAll(File dir,int count) {

        for (int i = count;i > 0;i--) {
            System.out.print("|---");
        }
        count++;
        System.out.println(dir.getName());
        //获取dir目录下面所有的文件和文件件
        File[] files = dir.listFiles();
        for (File file: files) {
            //如果文件本身是文件夹,则需要继续查找下面的内容
            if (file.isDirectory()) {
                //所以这里使用了递归,调用了自己。
                listAll(file,count);
            } else {
                for (int i = count;i > 0;i--) {
                    System.out.print("|---");
                }
                System.out.println(file.getName());
            }
        }
    }
}

打印结果:
demo
|—1
|—|---11
|—|---22
|—2
|—3
|—4
|—5
|—6
|—ttt - 副本 (2) - 副本.txt
|—ttt - 副本 (2).txt
|—ttt - 副本 - 副本 - 副本.txt
|—ttt - 副本 - 副本.txt
|—ttt - 副本.txt
|—ttt.txt

删除带内容的目录

删除带内容的目录需要从最里层的文件和文件逐渐往外删除

import java.io.File;

/**
 * 删除带内容的目录
 */
class DeleteDirTest {
    public static void main(String[] args) {
        delDir(new File("d:\\listFile"));
    }
	/**
	*删除一个带内容的文件夹
	*/
    public static void delDir(File dir) {
        File[] files = dir.listFiles();
        for (File file: files) {
            if (file.isDirectory()) {
            	//进行递归
                delDir(file);
            } else {
            	//如果是文件,打印信息之后进行删除
                System.out.println(file+"[file]" + file.delete());
                ;
            }
        }
        //打印当前目录,并且删除
        System.out.println(dir+"[dir]" + dir.delete());
        dir.delete();
    }
}

找到指定的文件类型,并把文件名称记录到一个文件中


import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 步骤:
 * 1.对文件夹进行深度遍历
 * 2.在遍历的过程中进行过滤,将符合条件的内容都存储到容器中
 * 3.对容器中的内容进行遍历并将文件名称写入到文件中
 */
class FindFileTest {
    public static void main(String[] args) throws IOException {
        //1.对文件夹进行深度遍历
        //2.在遍历的过程中进行过滤,将符合条件的内容都存储到容器中
        //3.对容器中的内容进行遍历并将文件名称写入到文件中
        List<File> files = new ArrayList<>();
        findFile(new File("d:\\test"),new FilenameFilter() {
            @Override
            public boolean accept(File dir,String name) {
                return name.endsWith(".java");
            }
        },files);
        writeToFile(files,new File("findFile.txt"));
    }

    public static void findFile(File dir,FilenameFilter filter,List<File> list) {
        File[] files = dir.listFiles();
        for (File file: files) {
            if (file.isDirectory()) {
                //进行递归
                findFile(file,filter,list);
            } else {
                //对文件进行过滤,如果符合条件,则将其存储到集合中
                if (filter.accept(dir,file.getName())) {
                    list.add(file);
                }
            }
        }
        //打印被查找的文件夹
        System.out.println(dir + "[dir]");
    }

    /**
     * 将文件列表写入文件
     */
    public static void writeToFile(List<File> files,File toFile) throws IOException {
        BufferedWriter bufferedWriter = null;
        try {
            bufferedWriter = new BufferedWriter(new FileWriter(toFile));
            for (File file: files) {
                bufferedWriter.write(file.getAbsolutePath());
                bufferedWriter.newLine();
                bufferedWriter.flush();
            }
        } finally {
            if (bufferedWriter != null) {
                bufferedWriter.close();
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值