Java IO 第1篇:带你认识 File 类

带你认识 File 类

一、初识 Java IO

Java IO 操作主要指的是使用Java进行输入、输出操作,Java 中的所有 IO 操作类都存放在 java.io 包中,在开发时需要导入此包。

在 Java 程序中,对于数据的输入、输出操作以流(stream)的方式进行,Java 提供了种类丰富的“流”类,java.io 包中重要的类有5个:File、InputStream、OutputStream、Reader、Writer。用来处理不同种类的数据,在程序开发过程中通过标准的代码进出数据的输入或输出操作。

输入输出流示意图.png

以程序为中心,从文件或者网络上读取到程序中就用输入流,从程序中写出到文件或者网络上就用输出流。

二、文件操作 File 类

1、File 类的基本介绍

File 类是文件和目录路径名的抽象表示,一个 File 对象的建立不等于创建了一个文件或者目录,而是指与文件或者目录建立了联系,通过 File 类的对象可以访问文件的属性、创建空文件和目录、以及删除文件和目录等操作。

2、File 类的两个常量和路径的三种表示形式

File.pathSeparator 表示系统默认路径分隔符,Windows 中使用“;”表示,Linux中使用“:”表示;File.separator 表示系统默认名称分隔符,Windows 中使用“\”表示,Linux中使用“/”表示。

Windows 中文件路径的表示方式用“\”来表示,在 Java 中需要通过转移字符“\”来表示;Linux 中文件路径表示方式用“/”来表示,当在程序里动态生成文件路径的时候可以使用系统默认名称分隔符 File.separator 来表示。

在开发中推荐大家使用“”/”来做目录名称的分隔符,不管是什么系统都可以使用,比如:
“D:/Download/image/tomcat.png”。

@Test
  public void test2()
    // 路径分隔符 windows(;) linux(:)
    System.out.println(File.pathSeparator); 
    // 名称分隔符 windows(\) linux(/)
    System.out.println(File.separator); 
    // 路径的几种表示形式
    // windows 的方式
    String path = "D:\\Download\\image\\tomcat.png"; 
    // 动态生成推荐使用这种方式
    path = "D:" + File.separator + "Download" + File.separator + "image" + File.separator + "tomcat.png"; 
    // 推荐使用的方式,什么平台都能用
    path = "D:/Download/image/tomcat.png"; 
    System.out.println(path);
  }

3、使用 File 类进行文件的判断操作

我们在操作文件的时候,经常会用到文件的判断操作,常用的判断操作有:文件或目录是否存在、是否是文件、是否是文件夹、获取文件的长度等等。

@Test
  public void test3() {
    String path = "D:/Download/image/tomcat.png";
    File file = new File(path);  // 建立与文件的联系
    System.out.println("文件是否存在:" + file.exists());
    System.out.println("文件是否是文件:" + file.isFile());
    System.out.println("文件是否是文件夹:" + file.isDirectory());
    // 返回字节数,如果是文件夹则读不出来长度
    System.out.println("文件的长度是:" + file.length());
    System.out.println("文件是否可写:" + file.canWrite());
    System.out.println("文件是否可读:" + file.canRead());
  }

4、使用 File 类进行文件的创建与删除

文件的创建操作用 createNewFile() 方法,文件不存在则创建新文件,存在则返回 false;文件的删除用 delete() 方法,文件不存在返回 false;在开发中,一般创建和删除文件时都会判断一下文件是否存在。

@Test
  public void test4() throws IOException, InterruptedException {
    String path = "D:/Download/image/tomcat.jpg";
    File file = new File(path); // 建立文件的联系
    if (!file.exists()) {
      boolean flag = file.createNewFile(); // 文件不存在则创建新文件,存在则返回false
      System.out.println(flag ? "文件创建成功" : "文件创建失败");
    }
    if (file.exists()) {
      boolean flag = file.delete(); // 文件不存在返回false
      System.out.println(flag ? "文件删除成功" : "文件删除失败");
    }
  }

5、使用 File 类进行目录的操作

目录的创建操作方法有两个,一是 mkdir() 方法,只有父目录存在的情况下才能创建成功;二是 mkdirs() 方法,如果父目录不存在则可把父目录一起创建出来。

目录的删除依然用 delete() 方法,如果目录下面有内容则返回 false;在开发中,一般使用 mkdirs() 方法创建目录。

@Test
  public void test5() throws IOException, InterruptedException {
    // 本地存在pic目录,但是没有photo和2020目录
    String path = "D:/Download/image/pic/photo/2020";
    File file = new File(path);
    System.out.println(file.mkdir()); // false
    System.out.println(file.mkdirs()); // true
  }

6、使用 File 类列出指定目录下的文件

在日常开发中,列出目录下的文件这个功能经常会用到,用 File[] listFiles() 方法可以列出目录下的文件或者文件夹,返回的是文件数组。通过循环遍历返回的文件数组就可以获取到每一个文件或者文件夹。listFiles() 方法使用的比较多。

还有一个 String[] list() 方法,它可以列出目录下的文件或者文件夹的名称,这个在开发中不常用。

@Test
  public void test6() {
    String path = "D:/Download/txt";
    File file = new File(path);
    if (file.exists()) {
      // 列出指定目录下的文件或目录的名称字符串数组,不常用
      String[] fileNmaes = file.list();
      System.out.println(Arrays.deepToString(fileNmaes));
      // 列出指定目录下的文件或目录的File对象数组,常用方法
      File[] files = file.listFiles();
      if (files != null) {
        for (File f : files) {
          System.out.println(f);
        }
      }
    }
  }

程序运行输出结果:
[123.txt, txt1]
D:\Download\txt\123.txt
D:\Download\txt\txt1

7、综合案例:列出指定目录下的全部内容

列出指定目录下的全部内容和列出指定目录下的文件,区别在于:指定目录下可能存在文件,也可能存在文件夹,子文件夹里也可能存在文件和文件夹。因此需要使用递归的方法完成。

开发思路:首先判断指定目录是否是目录,如果是目录的话,通过 listFiles() 方法获取该目录下的文件或者文件夹,循环取出 File 对象,调用递归方法完成文件路径的输出。

递归方法:递归方法必须要有结束的条件,同时要求递归的函数体内要调用自己。


@Test
  public void test7() {
    String path = "D:/Download/txt";
    File file = new File(path);
    print(file);
  }

  // 递归方法输出指定目录下的文件内容
  public static void print(File file) {
    if (file != null && file.exists()) {
      if (file.isDirectory()) {
        // 如果是目录的话,首先输出路径,然后继续获取该目录下的内容
        System.out.println(file);
        File[] files = file.listFiles();
        if (files != null) { // for循环前判空是个良好的开发习惯
          for (File f : files) {
            print(f); // 递归的函数体内要调用自己
          }
        }
      } else {// 直接打印文件的绝对路径,也就是递归结束的条件
        System.out.println(file);
      }
    }
  }

File 类是 Java IO 操作最基础的类,也是唯一的与文件产生关系的类,在所有 IO 操作之前都需要通过 File 类创建文件对象,从而与要操作的文件路径建立联系,之后才能通过选择具体的 IO 流进行文件的操作。

下一篇文章会给大家介绍 IO 流的分类与使用,敬请期待......

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容

  • 1、IO介绍 在前期的学习上述知识点的过程中,我们书写的任何程序,它运行的时候都会有数据的产生,比如时间数据,而这...
    Villain丶Cc阅读 1,437评论 0 3
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,695评论 0 3
  • 一. Java基础部分.................................................
    wy_sure阅读 3,810评论 0 11
  • 1 IONo18 1.1IO框架 【 IO:Input Output 在程序运行的过程中,可能需要对一些设备进...
    征程_Journey阅读 957评论 0 1
  • 今天,突然听到了一首歌,旋律很动听,是一首民谣,我记得最清楚的一句就是:“你是我患得患失的梦,我是你可有可无的人”...
    鈡玖阅读 164评论 0 2