Java I/O 从0到1 - 第Ⅰ滴血 File

Posted 蚂蚁分享圈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java I/O 从0到1 - 第Ⅰ滴血 File相关的知识,希望对你有一定的参考价值。

前言

  File 类的介绍主要会依据《Java 编程思想》以及官网API 。相信大家在日常工作中,肯定会遇到文件流的读取等操作,但是在搜索过程中,并没有找到一个介绍的很简洁明了的文章。因此,在最近比较轻松的时间里做一个关于 《Java I/O 从0到1》系列。规划是包括以下几个方面:File类、字节流、字符流、字节字符的组合使用、编码示例以及JDK1.4 推出的为了提高性能增加了功能的nio类(新I/O)。那么,接下来,进行File 的介绍。

File

  从File 的字面意思来讲,就会认为指的是文件。其实并不是如此,File类名字有一定的误导性。FilePath(文件路径)对此类来说是个更好的名字。摘自《Java编程思想 第四版》。File类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。

  1. 它既能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。

  2. 如果指的是一个文件集,那么就可以使用list(),此时会返回一个字符数组。

下面提供一个根据官网API整理的思维导图(邮件点击图片 新标签页打开 查看图片):

 

Xmind思维导图下载链接:http://pan.baidu.com/s/1jIzMzAY

  新建文件

    1. 创建文件的时候一定要制定路径,不然会提示找不到路径错误!

    2. new File(String pathName) 并不是真实创建文件,而是指向新建文件的引用

    3. File.separator 不同的系统平台 路径分隔符不一样,Window:\\\\  Unix/Linux://。因此此处不要写死路径

 

 1 /**
 2      * 
 3      * Title: createNewFile
 4      * Description: 创建文件
 5      * @author yacong_liu Email:2682505646@qq.com
 6      * @date 2017年9月19日下午6:06:24
 7      * @param pathname
 8      */
 9     public static void createNewFile(String pathname){
10         //创建文件的时候 不指定路径
11         File file = new File(pathname);
12         try {
13             file.createNewFile();
14             System.out.println(file.createNewFile());
15         } catch (IOException e) {
16             e.printStackTrace();
17             System.err.println(" create new file error ");
18         }
19         
20         //创建文件的时候制定路径
21         try {
22             File file1 = new File("D:"+File.separator+"tmp",pathname);
23             System.out.println(file1);
24             System.out.println(file1.createNewFile());
25         } catch (IOException e) {
26             System.err.println(" create new file1 error ");
27             e.printStackTrace();
28         }
29         
30         /**
31          * Console:
32          * false
33          * D:\\tmp\\a.txt
34          * true
35          */
36         
37     }
新建文件

 

  列出所有

    使用目录路径名创建File,此时File表示的是目录

 1 ======listAllFile("D:\\\\tmp"); ======
 2 
 3 /**
 4      * 
 5      * Title: listAllFile
 6      * Description: 列出所有文件
 7      * @author yacong_liu Email:2682505646@qq.com
 8      * @date 2017年9月19日下午6:16:57
 9      * @param path
10      */
11     private static void listAllFile(String path){
12         //path 为目录名  此处的File 表示目录
13         File dir = new File(path);
14         if(dir.isDirectory()){
15             File[] files = dir.listFiles();
16             System.out.println("目录"+dir.getName()+"下所有文件:");
17             
18             for (File file : files) {
19                 System.out.println(file.getName()+" ");
20             }
21         }
22         /**
23          * Console:
24          * 目录tmp下所有文件:
25             a.txt 
26             b.txt 
27          */
28     }
列出指定目录下所有文件

  列出指定文件

    使用目录列表器,进行限定文件的显示。实现FilenameFilter 接口

 1 package io;
 2 
 3 import java.io.File;
 4 import java.io.FilenameFilter;
 5 
 6 public class DirFilter implements FilenameFilter {
 7     String extension = "."; 
 8     
 9     public DirFilter(String fileExtensionNoDot) {
10         extension += fileExtensionNoDot;
11     }
12 
13     @Override
14     public boolean accept(File dir, String name) {
15         return name.endsWith(extension);
16     }
17 
18 }
目录列表器

  DirFilter 这个类存在的唯一原因就是accept()方法.创建这个类的目的在于吧accept()方法提供给list()使用,是list()可以回调accept(),进而决定哪些文件包含在列表中。因此这种结构也叫做 回调。更具体地说,使用的是策略模式的思想,因为list()实现了基本的功能,而且按照FilenameFilter的形式提供了这个策略。

 1 ========listFileByExtension("D:\\\\tmp","java");=======
 2 /**
 3      * 
 4      * Title: listFileByExtension
 5      * Description:  列出目录下指定文件
 6      * @author yacong_liu Email:2682505646@qq.com
 7      * @date 2017年9月19日下午6:43:02
 8      * @param path 目录
 9      * @param extension 文件扩展名
10      */
11     private static void listFileByExtension(String path,String extension){
12         File dir = new File(path);
13         if(dir.isDirectory()){
14             File[] files = dir.listFiles(new DirFilter(extension));
15             System.out.println("目录 "+dir.getName()+"下的"+extension+"文件有:");
16             for (File file : files) {
17                 System.out.println(file.getName()+" ");
18             }
19         }
20         /**
21          * Console:
22          * 目录 tmp下的java文件有:
23             1.java 
24          */
25     }
列出目录中指定扩展名文件

  删除文件夹下所有文件以及该文件夹

    获取制定目录下的所有File,判断每一个File 是否是文件,如果是文件,就直接删除,如果是目录就递归调用该方法进行删除。

 1 ==========deleteDirectory(new File("D:\\\\tmp"));======    
 2     /**
 3      * 
 4      * Title: deleteDirectory
 5      * Description: 删除文件夹下所有文件以及该文件夹
 6      * @author yacong_liu Email:2682505646@qq.com
 7      * @date 2017年9月19日下午10:04:27
 8      * @param file
 9      */
10     private static void deleteDirectory(File file) {
11         File[] fileArr = file.listFiles();
12         if (fileArr.length > 0) {
13             for (int i = 0; i < fileArr.length; i++) {
14                 if (fileArr[i].isFile()) {
15                     if (fileArr[i].delete()) {
16                         System.out.println(fileArr[i] + "文件删除成功!");
17                     } else {
18                         System.err.println(fileArr[i] + "文件删除失败!");
19                     }
20                 } else {
21                     // 递归
22                     deleteDirectory(fileArr[i]);
23                 }
24             }
25         }
26 
27         // 删除该文件夹
28         if (file.delete()) {
29             System.out.println(file + "文件夹删除成功!");
30         } else {
31             System.err.println(file + "文件夹删除失败!");
32         }
33         
34         /**
35          * Console:
36          *  D:\\tmp\\1 - 副本 (2).java文件删除成功!
37             D:\\tmp\\1 - 副本.txt文件删除成功!
38             D:\\tmp\\1.txt文件删除成功!
39             D:\\tmp文件夹删除成功!
40          */
41     }
删除文件夹下所有文件以及该文件夹

  创建文件夹

    创建文件夹的时候,需要注意的也就是是创建一级目录(mkdir())还是创建多级目录(mkdirs())?

  下面举得这个例子还是符合实际的,一般情况下,业务系统中队产生的文件进行保存到磁盘的时候,就需要按照 指定目录/年/月/日/file  这样的格式进行保存。

 1 /**
 2      * 
 3      * Title: createDirectory Description: 创建多级文件夹
 4      * 
 5      * @author yacong_liu Email:2682505646@qq.com
 6      * @date 2017年9月19日下午10:31:52
 7      */
 8     private static void createDirectory() {
 9         String year = null;
10         String month = null;
11         String day = null;
12         String[] strings = getDate();
13         year = strings[0];
14         month = strings[1];
15         day = strings[2];
16 
17         // File dir = new File("D:\\\\tmp2\\\\2017\\\\9\\\\19");
18         File dir = new File(
19                 "D:" + File.separator + "tmp3" + File.separator + year + File.separator + month + File.separator + day);
20 
21         if (!dir.exists()) {
22             if (dir.mkdirs()) {
23                 System.out.println(dir.getAbsolutePath() + " 文件夹创建成功!");
24             } else {
25                 System.err.println(dir.getName() + " 文件夹创建失败!");
26             }
27         } else {
28             System.err.println(dir.getName() + " 文件夹已经存在!");
29         }
30     }
31 
32     private static String[] getDate() {
33         SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
34         String date = f.format(new Date(System.currentTimeMillis()));
35         String[] strings = date.split("-");
36         return strings;
37     }
创建多级目录

 

那么到这里呢,关于File 类的介绍,大致就是上面总结的这些,需要更为详细的理解File的话,还是建议常浏览API文档:http://commons.apache.org/proper/commons-io/javadocs/api-release/index.html

 

以上是关于Java I/O 从0到1 - 第Ⅰ滴血 File的主要内容,如果未能解决你的问题,请参考以下文章

Java(20)file i/o

从零学Java之字面量和常量,我家AD想要第一滴血

Java自用高级编程-6.I/O流

JAVA I/O

File I/O 小结

Java I/O 处理