JAVA I/O系统 Thinking in Java 之 File类

  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();

  }

  }

原文地址:https://www.cnblogs.com/djw12333/p/12029010.html

时间: 2024-11-09 00:06:28

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

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

在上一章博客中简单的介绍了Java IO流的一些特征.也就是对文件的输入输出,既然至始至终都离不开文件,所以Java IO流的使用得从File这个类讲起. File类的描述:File类是文件和目录路径名的抽象表示形式,主要用于文件和目录的创建.查找和删除等操作.即Java中把文件或者目录(文件夹)都封装成File对象.也就是说如果我们要去操作硬盘上的文件或者目录只要创建File这个类即可. 不过要注意的是File类只是对文件的操作类,只能对文件本身进行操作,不能对文件内容进行操作. 1.File

java中IO常见的IO流和file类理论总结

总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中,所有输入流类都是抽象类InputStream(字节输入流),或者抽象类Reader(字符输入流)的子类:而所有输出流都是抽象类OutputStream(字节输出流)或者Writer(字符输出流)的子类. [首先需要明白的是:流是干什么的???(为了永久性的保存数据) 根据数据流向的不同分为输入流和输出流: 根据处理数据类型的不同分为字符流和字节流: ]

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

编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象.“流”屏蔽了实际的I/O设备中处理数据的细节. 在这个系列的第一篇文章:<<Java I/O系统学习系列一:File和RandomAccessFile>>中,我们讲到RandomAccessFile可以写入和读取文件,具备I/O功能,但是其只能针对文件,而I/O还涉及到很多其他场景比如网络.读取内存中的字符串等,所以Java类库中提供了一系列的类库来对其进行支持,也就是

Java基础之File类(十一)

java.io.File类代表系统文件名(路径和文件名). java.io.IOException:输入输出文件流异常处理类. File类的常见构造方法: public File(String pathname):以pathname为路径创建File对象,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储. public File(String parent,String child):以parent为父路径,child为子路径创建File对象. File的静态属性

java I/O系统(输入输出流)

java I/O系统(输入输出流) 流的特性1.含有流质(数据)2.它有方向(读或写) 流的分类: 输入流和输出流 输入流:io包中的输入流继承自抽象类InputStream或Reader 输出流:io包中的输入流继承自抽象类OutputStream或Writer 字节流和字符流 注:1字节代表1个英文单词存储的数据大小,一个汉字占两字节 1.字节流:以byte为最小单位传送,继承自抽象类InputStream或OutputStream,用于处理二进制文件,InputStream为读取字节流的父

java I/O系统

I:Input 输入 O:Output 输出 二:流的分类 按照方向:输入流  输出流 按照最小单位:字节流 (byte)  字符流 (char) 三: 所有的I/O系统操作都由以下步骤构成 1)建立流 2)操作流 3)关闭流 四:文件类 java.io包中的File类提供了管理磁盘文件和目录的基本功能 File类有四种构造方法 最常用的的是  public File(URI uri)  URI是资源统一标识符 java.io.File的一些方法,主要还是要查看API文档. 1 package

java中获取系统属性以及环境变量

java中获取系统属性以及环境变量 System.getEnv()和System.getProperties()的差别 从概念上讲,系统属性 和环境变量 都是名称与值之间的映射.两种机制都能用来将用户定义的信息传递给 Java 进程.环境变量产生很多其它的全局效应,由于它们不仅对Java 子进程可见,并且对于定义它们的进程的全部子进程都是可见的.在不同的操作系统上,它们的语义有细微的区别,比方,不区分大写和小写.由于这些原因,环境变量更可能有意料不到的副作用.最好在可能的地方使用系统属性.环境变

Java 获取当前系统时间方法比较

转载: http://blog.csdn.net/zzjjiandan/article/details/8372617 一. 获取当前系统时间和日期并格式化输出: import java.util.Date;import java.text.SimpleDateFormat; public class NowString {public static void main(String[] args) { SimpleDateFormat df = new SimpleDateFormat("yy

java I/O系统总结

参考了Thinking in java I/O部分,发现该书更多是从开发者原理性角度去描述I/O系统,这样使得让初学者不太好懂,后面我参考了"尚学堂"关于这部分视频讲解,感觉比较适合初学,有条理性.容易理解. 首先介绍关于流的概念,流比喻成管道. 上一张图片很清晰对流进行分类.最简单方法我们对上图四个抽象类在java API中进行查阅具体提供方法.这里还需要注意区分就是字节.字符这两个基本概念不同. 接下来对节点流和处理流两个概念. 这个就是我认为java I/O比较不方便的,不是直接