File类的文件具有一定的误导性,我们可能会认为它指代的是文件,实际上并非如此。它技能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。如果它指的是一个文件集,我们就可以对此集合调用list()方法,从而获取一个目录下的所有文件名称。实际上,FilePath是一个更好的名字。

  1.目录列表器

  这里尝试获取一个目录下的全部文件和部分文件,首先获取目录下所有的文件名称。

  public static void main(String[] args) {

  String filePath = "D:\\file\\imgs\\order";

  File file = new File(filePath);

  String[] list = file.list();

  //打印该目录下所有的文件

  System.out.println(Arrays.toString(list));

  }

  控制台:

  [2dbbd28c3f3b4d3b591557fec3e6a528.png, abc.png, adbc.jpg, afa409b3e0db9edd5f5f91ccb4781546.png, asd.jpeg, b121502f8ed9346f9ee1236e5a1f7ab4.png, b121502f8ed9346f9ee1236e5a1f7ab4.png.webp]

  然后我们尝试获取该目录下所有的png文件。

  String[] list1 = file.list(new FilenameFilter() {

  private Pattern pattern = Pattern.compile(".*\\.png");

  @Override

  public boolean accept(File dir, String name) {

  return pattern.matcher(name).matches();

  }

  });

  System.out.println(Arrays.toString(list1));

  控制台:

  [2dbbd28c3f3b4d3b591557fec3e6a528.png, abc.png, afa409b3e0db9edd5f5f91ccb4781546.png, b121502f8ed9346f9ee1236e5a1f7ab4.png]

  此处用到了接口FilenameFilter,该接口的定义十分简单,内部只有一个accecpt方法,我们可以使用匿名内部类自定义实现过滤方法。

  2.目录实用工具

  目录遍历器Driectory和格式化打印器PPrint。原理还是利用过滤接口FilenameFilter+正则Pattern来实习,使用Directory可以遍历某个目录下所有的符合正则表达式的文件。

  Driectory。

  /*

  * Copyright (c) 2019. 唐江华 保留所有权。

  */

  package com.io.fileClass;

  import java.io.File;

  import java.io.FilenameFilter;

  import java.util.ArrayList;

  import java.util.Iterator;

  import java.util.List;

  import java.util.regex.Pattern;

  /**

  * @author tangjianghua

  * @data @data

  */

  public final class Driectory {

  /**

  * 匹配dir下符合reg的所有文件,并返回文件数组

  * @param dir

  * @param reg

  * @return File[]

  */

  public static File[] local(File dir,final String reg){

  return dir.listFiles(new FilenameFilter() {

  private Pattern p = Pattern.compile(reg);

  @Override

  public boolean accept(File dir, String name) {

  return p.matcher(name).matches();

  }

  });

  }

  /**

  * 匹配path下符合reg的所有文件,并返回文件数组

  * @param path

  * @param reg

  * @return File[]

  */

  public static File[] local(String path,final String reg){

  return local(new File(path),reg);

  }

  /**

  * 匿名内部类TreeInfo

  * 用来封装每级目录和文件

  */

  public static class TreeInfo implements Iterable{

  public List files = new ArrayList();

  public List dirs = new ArrayList();

  @Override

  public Iterator iterator() {

  return files.iterator();

  }

  //添加另一个对象的元素

  void addAll(TreeInfo other){

  files.addAll(other.files);

  dirs.addAll(other.dirs);

  }

  @Override

  public String toString() {

  // 使用工具PPrint打印

  return "dirs: " +PPrint.pformat(dirs)+"\n\nfiles: "+PPrint.pformat(files);

  }

  }

  public static TreeInfo walk(String start ,String reg){

  return recurseDirs(new File(start), reg);

  }

  public static TreeInfo walk(File start ,String reg){

  return recurseDirs( start , reg);

  }

  public static TreeInfo walk(String start){

  return recurseDirs(new File(start), ".*");

  }

  public static TreeInfo walk(File start){

  return recurseDirs( start , ".*");

  }

  /**

  * 从其实目录startDir开始遍历获取所有的目录和文件

  * @param startDir

  * @param reg

  * @return TreeInfo

  */

  static TreeInfo recurseDirs(File startDir ,String reg){

  TreeInfo result = new TreeInfo();

  for (File item : startDir.listFiles()) {

  if (item.isDirectory()) {

  //如果是目录,则添加目录并递归

  result.dirs.add(item);

  result.addAll(recurseDirs(item,reg));

  }else {

  // 过滤文件

  if (startDir.getName().matches(reg)) {

  result.files.add(item);

  }

  }

  }

  return result;

  }

  public static void main(String[] args) {

  if(args.length == 0){

  //如果参数长度为0,则walk当前目录

  System.out.println(walk("."));

  }else{

  for (String arg: args){

  System.out.println(walk(arg));

  }

  }

  }

  }

  PPrint。

  /*

  * Copyright (c) 2019. 唐江华 保留所有权。

  */

  package com.io.fileClass;

  import java.util.Arrays;

  import java.util.Collection;

  /**

  * @author tangjianghua

  * @data @data

  */

  public class PPrint {

  public static String pformat(Collection c){

  if (c.size() == 0) {

  return "[]";

  }

  StringBuilder result = new StringBuilder("[");

  for (Object elem : c) {

  if (c.size() != 1) {

  result.append("\n");

  }

  result.append(elem);

  }

  if (c.size() != 1) {

  result.append("\n");

  }

  result.append("]");

  return result.toString();

  }

  public static void pprint(Collection c){

  System.out.println(pformat(c));

  }郑州较好的妇科医院 http://www.kd0371.com/

  public static void pprint(Object[] c){

  System.out.println(Arrays.asList(c));

  }

  }

  3.目录的检查及创建

  这一小结来认识File有哪些方法,可以帮助我们做什么。

  package com.io.fileClass;

  import java.io.File;

  import java.io.IOException;

  import java.util.Date;

  /**

  * @author tangjianghua

  * @data @data

  */

  public class MakeDirectories {

  public static void main(String[] args) throws IOException{

  String path = "D:/test/child/test.txt";

  File file = new File(path);

  System.out.println("File存不存在:"+file.exists());

  System.out.println("File如果不存在我们创建它的父级目录:"+file.mkdirs());

  // System.out.println("File如果不存在我们创建它:"+file.mkdir());

  System.out.println("File如果不存在我们创建它:"+file.createNewFile());

  System.out.println("File是路径吗:"+ file.isDirectory());

  System.out.println("File是文件吗:"+ file.isFile());

  System.out.println("File的父级目录:"+file.getParent());

  System.out.println("File的绝对路径:"+file.getAbsolutePath());

  System.out.println("File的规范路径:"+file.getCanonicalPath());

  System.out.println("File的路径:"+file.getPath());

  System.out.println("File是否可读:"+file.canRead());

  System.out.println("File是否可写:"+file.canWrite());

  System.out.println("File是否可执行:"+file.canExecute());

  System.out.println("File是否是绝对的:"+file.isAbsolute());

  System.out.println("File是否被隐藏:"+file.isHidden());

  System.out.println("File的名称:"+file.getName());

  System.out.println("File最后一次修改时间:"+ new Date(file.lastModified()));

  //File如果存在则删除:

  file.deleteOnExit();

  }

  }

JAVA I/O系统 Thinking in Java 之 File类的更多相关文章

  1. Java I/O系统学习系列一:File和RandomAccessFile

    I/O系统即输入/输出系统,对于一门程序语言来说,创建一个好的输入/输出系统并非易事.因为不仅存在各种I/O源端和想要与之通信的接收端(文件.控制台.网络链接等),而且还需要支持多种不同方式的通信(顺 ...

  2. Java IO流详解(二)——File类

    在上一章博客中简单的介绍了Java IO流的一些特征.也就是对文件的输入输出,既然至始至终都离不开文件,所以Java IO流的使用得从File这个类讲起. File类的描述:File类是文件和目录路径 ...

  3. java基础之io流总结二:File类基本应用

    File类的概述: File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹. File类保存文件或目录的各种元数据信息,包括文件名.文件长度.最后修改时间.是否可读 ...

  4. Java的IO系统

     Java IO系统     "对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务."     由于存在大量不同的设计方案,所以该任务的困难性是很容易证明的.其中最大的 ...

  5. Java 如何获取系统时间

    Java 如何获取系统时间 import java.text.SimpleDateFormat; import java.util.Date; public class Test { public s ...

  6. Java I/O系统学习系列二:输入和输出

    编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象.“流”屏蔽了实际的I/O设备中处理数据的细节. 在这个系列的第一篇文章:<< ...

  7. Java 学习(21):Java 实例

    Java 实例 本章节我们将为大家介绍 Java 常用的实例,通过实例学习我们可以更快的掌握 Java 的应用. Java 环境设置实例 //HelloWorld.java 文件 public cla ...

  8. 黑马程序员——JAVA基础之File类,递归,打印流,合并切割流

    ------- android培训.java培训.期待与您交流! ---------- File类 用来将文件或者文件夹封装成对象 方便对文件与文件夹的属性信息进行操作. File对象可以作为参数传递 ...

  9. 疯狂java笔记(五) - 系统交互、System、Runtime、Date类

    一.程序与用户交互(Java的入口方法-main方法): 运行Java程序时,都必须提供一个main方法入口:public static void main(String[] args){} publ ...

随机推荐

  1. 201871010112-梁丽珍《面向对象程序设计(java)》第十四周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  2. 接口规范、容错处理规则、aph备份数据规则

    前话:前后解耦,前端开发环节使用APH,后台开发环节postman(可考虑为后台也做一个aph后台版) 1.api标准:标识符(ret:1为正常数据,0为接口报错),数据体(data:api的数据容器 ...

  3. CSS中的父相子绝布局

    主要应用场景,就是我想要块的布局根据父级来定位,而不是根据页面. 例如,下面的例子中,我用两个半圆拼成一个正圆,思路是用一个父级标签把两个子标签包起来,父标签是一个正圆,然后子标签各占一半,先化成两个 ...

  4. HardFault_Handler的方法转载

    在硬汉平台看到一个比较好的帖子,关于如何定位HardFault_Handler,这里要记录下网址. http://www.armbbs.cn/forum.php?mod=viewthread& ...

  5. KMP 串的模式匹配 (25分)

    给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not ...

  6. 联合CRF和字典学习的自顶向下的视觉显著性-全文解读

    top-down visual saliency via joint CRF anddictionary learning 自顶向下的视觉显著性是使用目标对象的可判别表示和一个降低搜索空间的概率图来进 ...

  7. HTTP之Web服务器是如何进行工作的!

    Web服务器是如何进行工作的 ====================文章摘自<HTTP权威指南>====================== 1.  建立连接—接收一个客户端的连接,或者 ...

  8. Vue.js 源码分析(十四) 基础篇 组件 自定义事件详解

    我们在开发组件时有时需要和父组件沟通,此时可以用自定义事件来实现 组件的事件分为自定义事件和原生事件,前者用于子组件给父组件发送消息的,后者用于在组件的根元素上直接监听一个原生事件,区别就是绑定原生事 ...

  9. DFRobot模块物联网演示项目整合

    简介 本文是此次物联网项目的终结篇.本文将演示如何整合之前的文章中的模块和代码,来简单的完成一个物联网项目.最终的实现效果是:利用Iphone手机上的MQTTool App,来获取DHT11的温湿度数 ...

  10. [转帖]k8s 如何让你的应用活的更久

    k8s 如何让你的应用活的更久 https://www.jianshu.com/p/132319e795ae 众所周知,k8s 可以托管你的服务 / 应用,当出现各种原因导致你的应用挂掉之后,k8s ...