• 《Java I/O 从0到1》


    前言

      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:	mpa.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:	mp1 - 副本 (2).java文件删除成功!
    37             D:	mp1 - 副本.txt文件删除成功!
    38             D:	mp1.txt文件删除成功!
    39             D:	mp文件夹删除成功!
    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

     

  • 相关阅读:
    二分和三分
    windows对拍及其应用
    RMQ与st表
    图论最短路
    图论最小生成树
    贪心问题
    [转载]图论500题
    第二次重建博客。。
    二分和三分题
    树状数组
  • 原文地址:https://www.cnblogs.com/lyc-smile/p/7552776.html
Copyright © 2020-2023  润新知