概览

在计算机系统中,文件是非常重要的存储方式。Java的标准库java.io提供了File对象来操作文件和目录,所以,我们在操作文件和目录前需要构造File对象。
要构造一个File对象,需要传入文件路径:

  1. File f = new File("C:\\Windows\\readme.txt");
  2. System.out.println(f);

基本方法

  1. public class DemoController {
  2. public static void main(String[] args){
  3. File f = new File(".\\java\\hello.java");
  4. System.out.println(f.getPath()); // .\java\hello.java
  5. }
  6. }

其它基本方法:

  • getAbsolutePath() 该方法返回的是绝对路径,拼接上完整的路径但是不帮着处理. ..符号(.表示当前目录 ..表示上级目录),例如”.\java\hello.java” 则返回 “E:\javaProject\study.\java\hello.java”
  • isFile() 判断文件是否存在
  • isDirectory() 判断文件目录是否存在
  • canRead() 是否可读
  • canWrite() 是否可写
  • canExecute() 是否可执行 如果是目录则表示能否显示所有的文件和子目录
  • length() 文件字节大小
  • createNewFile() 创建一个新文件
  • delete() 删除文件:如果我们要删除一个文件,则把这个地址给File类,创建一个File实例,file.delete()即可删除。
  • createTempFile() 创建临时文件,与deleteOnExit()在JVM退出时删除改文件,两者联动使用
  • list()和listFiles() 列出目录下面所有文件和子目录名,listFiles提供了很多重载方法,可以过滤文件和目录
  • mkdir() 创建目录:把想要创建的目录路径给File类创建一个实例,file.mkdir()即可创建目录
  • mkdirs() 创建目录,如果父目录不存在也会创建
  • delete() 删除目录,目录必须为空才能删除成功

    磁盘操作

    File类可以用于表示文件和目录的信息,但是它不表示文件的内容。
    递归地列出一个目录下所有文件:

    1. public static void listAllFiles(File dir){//这里我们设置的是需要传入File对象
    2. //两种停止条件
    3. if(dir == null || !dir.exists()){
    4. return;
    5. }
    6. if(dir.isFile()){
    7. System.out.println(dir.getName());
    8. return;
    9. }
    10. //递归循环
    11. for(File file : dir.listFiles()){
    12. listAllFiles(file);
    13. }
    14. }

    从Java7 开始,可以使用Paths 和 Files 代替File

    Files 和 Paths类

  • Paths:通过get()方法返回一个Path对象,Path用于表示文件路径和文件。

  • Files:提供了大量处理文件的方法,例如文件复制、读取、写入,获取文件属性、快捷遍历文件目录等…..
  • Files 和 Paths是Java8新增的工具类,在处理文件方面功能非常强大。

paths 类

  1. //以当前路径作为Path对象
  2. Path p = Paths.get(".");
  3. //使用传入的字符串返回一个Path对象
  4. Path p2 = Paths.get("D","ReviewIO","URL");
  5. //对应的路径
  6. System.out.println("p对象的对应路径:" + p.toString());
  7. System.out.println("p2对象的对应路径:" + p2.toString());
  8. //路径数量是以路径名的数量作为标准
  9. System.out.println("p路径数量:" + p.getNameCount());
  10. System.out.println("p2路径数量:" + p2.getNameCount());
  11. //获取绝对路径
  12. System.out.println("p绝对路径:" + p.toAbsolutePath());
  13. System.out.println("p2绝对路径:" + p2.toAbsolutePath());
  14. //获取父路径
  15. System.out.println("p父路径:" + p.getParent());
  16. System.out.println("p2父路径:" + p2.getParent());
  17. //获取p2对象的文件名或者文件目录名
  18. System.out.println(p2.getFileName());
  19. //通过Path对象返回一个分隔符对象
  20. Spliterator<Path> split = p2.spliterator();

运行结果:
image.png
注:Paths类获取文件或文件目录路径可以使用采用多个字符串形式,也可以使用Path.get(D:\ReviewIO\URL)这种形式。返回的Path对象完全可以代替File类用于文件IO操作。

Files 类

读取文件

  1. // 将文件内容读取为byte数组
  2. byte[] data = Files.readAllBytes(Paths.get("/path/to/file.txt"));
  3. // 默认使用UTF-8编码读取:注意该方法只能在java11及之后使用
  4. String content1 = Files.readString(Paths.get("/path/to/file.txt"));
  5. // 可指定编码:
  6. String content2 = Files.readString(Paths.get("/path/to/file.txt"), StandardCharsets.ISO_8859_1);
  7. // 按行读取并返回每行内容:
  8. List<String> lines = Files.readAllLines(Paths.get("/path/to/file.txt"));

写入文件

  1. //写入内容到文件
  2. ArrayList<String> as = new ArrayList<>();
  3. as.add("A");
  4. as.add("B");
  5. as.add("C");
  6. Files.write(dest, as, Charset.forName("GBK"));
  7. //Files的write函数第一个参数是path,第二个参数是Iterable<? extends CharSequence>,
  8. Iterable是个顶级接口,实现类几乎都是集合类,并且限制了类型通配符上限是CharSequence
  9. 这意味着要使用泛型为字符类型的集合类作为数据写入指定文件中,很麻烦。

文件复制

  1. Path source = Paths.get("F:","Java经典练习题.pdf");
  2. Path dest = Paths.get("F:","files.txt");
  3. File file = new File("F:\\ok.pdf");
  4. file.createNewFile();//如果f对象对应路径不存在就创建一个。
  5. System.out.println("source对象的文件路径:" + source);
  6. //复制文件
  7. Files.copy(source, new FileOutputStream(f));