Skip to main content

moregeek program

第十二章《文件与i/o流》第1节:java的文件管理-多极客编程

​Java语言中,一个类就代表了一种事物,计算机磁盘上的文件和文件夹也是一种事物,文件夹也叫目录,Java语言以File类来代表计算机的磁盘文件以及目录,类的主要功能有:

  • 获取和设置磁盘文件或文件夹的基本属性。​
  • 创建和删除文件或目录。​
  • 扫描文件夹​

本小节将讲解如何使用File类来操作文件以及目录。​


12.1.1 使用File类操作文件

File类位于java.io包下,在Java语言中,一个File类的对象就表示磁盘上的一个文件或目录,File类的构造方法很多,但最常用的构造方法只有三个,如表12-1所示。​

表12-1File类常用构造方法​

File(String path)

File(String path, String filename)

File(File path, String filename)

表中第一个构造方法仅有一个字符串类型的参数path,path参数表示文件所在目录以及文件的名称。第二个构造方法有两个字符串参数,第一个参数path表示文件所在目录,第二个参数filename表示文件的名称。第三个构造方法也有两个参数,其中第一个参数以path属于File型,它也表示文件所在目录,而第二个参数也表示文件的名称。需要注意:以字符串表示的文件名称必须包含文件的后缀名。文件所在目录可以用相对路径和绝对路径两种方式来表示。如果以相对路径来表示目录,那么目录表示位于IDEA的工程文件夹下的文件夹。例如:​

File file = new File("abc","game.txt");

以上代码中,参数“abc”表示文件所在目录,这个目录就是使用相对路径的形式表示。如果开发者使用IDEA编程工具,那么这个目录表示工程文件夹中的abc文件夹。磁盘上的目录往往分为多层,在Java语言中,每一层目录以“/”或“\\”作为路径分隔符。此外,在表示相对路径时,使用“.”表示当前目录, “..”表示上一级目录,“/”或“\\”表示磁盘根目录。​

File类提供了很多用于操作文件和获取文件属性的方法,如表12-2所示。​

表12-2 File类常用方法​

方法

作用

String getName()

返回此File对象所表示的文件名或路径名(如果是路径,则返回最后一级子路径名)

String getPath()

返回此File对象所对应的路径名

File getAbsoluteFile()

返回此File对象的绝对路径

String getAbsolutePath()

返回此File对象所对应的绝对路径名

String getParent()

返回此File对象所对应目录(最后一级子目录)的父目录名

boolean renameTo(File newName)

重命名此File对象所对应的文件或目录,如果重命名成功,则返回true,否则返回false

boolean exists()

判断File对象所对应的文件或目录是否存在

boolean canWrite()

判断File对象所对应的文件和目录是否可写

boolean canRead()

判断File对象所对应的文件和目录是否可读

boolean isFile()

判断File对象所对应的是否是文件,而不是目录

boolean isDirectory()

判断File对象所对应的是否是目录,而不是文件

boolean isAbsolute()

判断File对象所对应的文件或目录是否是绝对路径

long lastModified()

返回文件的最后修改时间

long length()

返回文件内容的大小(单位:字节)

boolean createNewFile()

当此 File对象所对应的文件不存在时,新建一个该File对象所指定的新文件,如果创建成功则返回 true;否则返回false。

boolean delete()

删除 File对象所对应的文件或目录,删除成功返回true,否则返回false

void deleteOnExit()

如果File类对象对应的文件或路径存在时进行删除

下面的【例12_01】展示了如何使用File类的方法访问一个文件。由于程序要对文件进行操作,读者需要在C盘根目录下新建一个名为temp的文件夹,之后在文件夹中新建一个12_01.txt文本文件,在这个文件中写入“你好abc”并保存。​

【例12_01 使用File类访问文件】

Exam12_01.java​

import java.io.File;
public class Exam12_01 {
public static void main(String[] args) {
File file = new File("C:/temp/12_01.txt");
System.out.println("文件是否存在:"+file.exists());
System.out.println("文件路径:"+file.getPath());
System.out.println("绝对路径:"+file.getAbsolutePath());
System.out.println("文件所在目录:"+file.getParent());
System.out.println("是否可读:"+file.canRead());
System.out.println("是否可写:"+file.canWrite());
System.out.println("是否是隐藏文件:"+file.isHidden());
System.out.println("是否是普通文件:"+file.isFile());
System.out.println("是否是文件目录:"+file.isDirectory());
System.out.println("文件的最后修改时间:"+file.lastModified());
System.out.println("文件大小:"+file.length()+"字节");
}
}

【例12_01】的运行结果如图12-1所示。​

第十二章《文件与I/O流》第1节:Java的文件管理_Java

图12-1【例12_01】运行结果​

从图12-1可以看出:文件的最后修改是时间是一个long型的数据,这个数字实际上就是距离时间原点的毫秒数,读者可以用这个数字作为参数创建一个Date类对象,这样就能获得文件最后被修改的年月日和时分秒。此外还可以看出:文件的大小为7字节,这是因为在txt文件默认编码格式下,每个汉字占据2个字节,而每个英文字母占据1个字节,因此文件中的“你好abc”总共占7字节。如果File类对象表示的是一个根本不存在的文件,那么程序运行时所有返回值类型为boolean的方法将全部返回false,而最后修改时间以及文件的大小都是0,读者可以自行尝试使用File类对象表示一个不存在的文件并获取其各项属性。​

12.1.2使用File类操作目录

File类不仅仅定义了操作文件的方法,还定义了用于操作目录的方法,如表12-3所示。​

表12-3File类操作目录的方法​

方法

作用

String[] list()

列出目录中的所有文件或子目录的名称

String[] list(FilenameFilter filter)

列出目录特定名称或后缀名的文件和子目录

File[] listFiles()

列出目录中所有文件和子目录

File[] listFiles(FilenameFilter filter)

列出目录中特定名称或后缀名的文件

boolean mkdir()

建立单级目录

boolean mkdirs()

建立多级目录

static File[] listRoots

列出系统所有根目录(即磁盘分区)

从表12-3可以看出:list()方法和listFiles()方法都可以没有参数,也都可以添加一个FilenameFilter类型的参数。FilenameFilter是一个接口,该接口定义了一个抽象方法accept(),这个方法用来定义哪些名称的文件会被列出,因此程序员在实现accept()抽象方法时要设定文件的筛选条件。下面的【例12_02】展示了如何用File类对象操作目录,为展示出搜索文件的效果,各位读者需要在C盘的temp的文件夹中再新建一些文件,如图12-2所示。​

第十二章《文件与I/O流》第1节:Java的文件管理_Java_02

图12-2 temp文件夹​

【例12_02使用File类访问目录】

Exam12_02.java​

import java.io.*;
class Filter implements FilenameFilter{
@Override
public boolean accept(File dir, String name) {
// 搜索所有txt文本文件
return name.endsWith(".txt");
}
}
public class Exam12_02 {
public static void main(String[] args) {
Filter filter = new Filter();
File dir = new File("C:/temp");//dir是要访问的目录
//列出该目录下所有文件的名称
String[] names1 = dir.list();
System.out.println("temp文件夹下所有文件及子文件夹的名称:");
for(String name:names1){
System.out.print(name+" ");
}
System.out.println();
//列出该目录下txt文本文件名称
String[] names2 = dir.list(filter);
System.out.println("temp文件夹下所有txt文件的名称:");
for(String name:names2){
System.out.print(name+" ");
}
System.out.println();
//列出该目录下所有文件
File[] files1 = dir.listFiles();
System.out.println("temp文件夹下所有文件及子文件夹详情:");
System.out.printf("%-25s%-15s%-10s\n","名称","大小","是否为目录");
for(File file:files1){
String name= file.getName();
long length = file.length();
boolean isDir = file.isDirectory();
System.out.printf("%-20s%-15d%-10b\n",name,length,isDir);
}
}
}

【例12_02】的Exam12_02.java文件中包含两个类,其中Filter类是FilenameFilter接口的实现类,它在实现accept()抽象方法时指定要列出的文件必须以“.txt”作为名称结尾。【例12_02】的运行结果如图12-3所示。​

第十二章《文件与I/O流》第1节:Java的文件管理_文件管理_03

图12-3【例12_02】运行结果​

从图12-3可以看出:在列出以“.txt”作为名称结尾的文件时,把文件夹“文件夹1.txt”也列了出来,如果想只是列出文件不包括文件夹,还需要用isFile()方法进行第二次筛选。

本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。

©著作权归作者所有:来自51CTO博客作者穆哥学堂的原创作品,请联系作者获取转载授权,否则将追究法律责任

第十三章《集合》第2节:list集合-多极客编程

​List这个单词意为“列表”,List类型的集合的特点是:元素呈线性排列,致密且有序。下面的图13-3展示了List类型集合的特点。图13-3 List类型集合​图13-3中的每一个小圆形代表一个元素,可以看到,这些元素被放到List集合中后被排成一列,这就是“线性排列”。List集合中的元素都是连续的,中间不会空隙,这个特点可以概括为“致密”。List集合中每个元素都有自己的索引,因此它们有先

第十五章《网络编程》第4节:基于udp协议的网络编程-多极客编程

​UDP协议是一种不可靠的网络协议,之所以说这种协议不可靠,是因为它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路。这两个Socket只是发送、接收数据报的对象。Java 提供了DatagramSocket对象作为基于UDP协议的Socket,而使用DatagramPacket代表DatagramSocket发送、接收的数据报。本小节将详细讲解基于UDP协议的网络编

第十六章《正则表达式》第1节:正则表达式入门-多极客编程

​正则表达式能够定义一个字符串的格式,读者也可以理解为定义一个字符串的结构特征,例如定义一个电子邮件地址的结构特征等。而书写正则表达式需要使用一些有特殊含义的符号,专业上把这种有特殊含义的符号称为“通配符”这些通配符有的代表数字,有的代表字母,因此使用通配符可以很容易的定义出如连续的3个数字、连续的8个字母这样的特定格式,本小节将讲解如何使用这些通配符。16.1.1通配符Java语言中表示字符串的

第十一章《java实战常用类》第9节:comparable接口和comparator接口-多极客编程

​对事物进行比较往往是希望对它们进行排序,因此排序的结果是由比较的结果产生的。而对事物进行比较就需要明确比较的内容是什么。例如某学校择优录取考生,就要比较所有考生的成绩,然后排列出考分的高低,而学生入学之后可能又要根据身高来排列出座位的次序。因此对两个学生进行比较,就必须先要明确到底是比较他们的考试成绩还是比较他们的身高。如果希望对两个类型相同的对象进行比较,也需要在类当中明确定义出比较规则,否则

第十章《日期与时间》第5节:period与duration-多极客编程

​如何在程序中表示出一个时间段呢?有人想到可以用ChronoUnit枚举值来表示,但ChronoUnit的每一个枚举值都只是一个时间单位,如果想准确的表示出一个时间段,还必须加上一个时间单位的数量。例如程序中想表示一个长度为3天的时间段,就必须用整数3和ChronoUnit.DAYS枚举值这两个数据来表示。这种表示方式导致必须把时间的数量和时间的单位组合起来才能表示出一个时间段,因此在程序中无法把

第十九章《类的加载与反射》第3节:反射-多极客编程

​JAVA的反射机制是指在运行状态中,对于任意一个类都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。反射是Java语言中非常重要机制,很多第三方框架都用到了反射,本小节将详细讲解反射机制的原理和作用。19.3.1获得Class类对象每个类被加载之后,虚拟机就会为该类生成一个对应的Clas

第十三章《集合》第2节:list集合-多极客编程

​List这个单词意为“列表”,List类型的集合的特点是:元素呈线性排列,致密且有序。下面的图13-3展示了List类型集合的特点。图13-3 List类型集合​图13-3中的每一个小圆形代表一个元素,可以看到,这些元素被放到List集合中后被排成一列,这就是“线性排列”。List集合中的元素都是连续的,中间不会空隙,这个特点可以概括为“致密”。List集合中每个元素都有自己的索引,因此它们有先

c语言--指针1-多极客编程

0.问题的引入  int a = 5; a = 1024;// 把数值1024存放到变量a对应的存储单元的地址中去 b = a; //取变量a的值,赋值给b => 在C语言中,任何变量都有两层含义: (1) 代表该变量的地址: 左值 lvalue (2) 代表该变量的值 : 右值 rvalue 对于变量的访问,只有两种情况: w

第十五章《网络编程》第4节:基于udp协议的网络编程-多极客编程

​UDP协议是一种不可靠的网络协议,之所以说这种协议不可靠,是因为它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路。这两个Socket只是发送、接收数据报的对象。Java 提供了DatagramSocket对象作为基于UDP协议的Socket,而使用DatagramPacket代表DatagramSocket发送、接收的数据报。本小节将详细讲解基于UDP协议的网络编

一种将函数模板定义和声明分开的方法-多极客编程

        在 C++ 中为了操作简洁引入了函数模板。所谓的函数模板实际上是建立一个通用函数,其函数类型或形参类型不具体指定,用一个虚拟的类型来表达,这个通用函数就称为函数模板。1、通用的写法        函数模板不是一个具体的函数,编译器不能为其生成可执行代码。定义函数模板后只是一个对函数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能。为了容易使用,一般通用的写法都是在头文

第十一章《java实战常用类》第9节:comparable接口和comparator接口-多极客编程

​对事物进行比较往往是希望对它们进行排序,因此排序的结果是由比较的结果产生的。而对事物进行比较就需要明确比较的内容是什么。例如某学校择优录取考生,就要比较所有考生的成绩,然后排列出考分的高低,而学生入学之后可能又要根据身高来排列出座位的次序。因此对两个学生进行比较,就必须先要明确到底是比较他们的考试成绩还是比较他们的身高。如果希望对两个类型相同的对象进行比较,也需要在类当中明确定义出比较规则,否则

c++ string 基本用法-多极客编程

一、C++string的创建方式1、string的头文件#include <iostream>//等价于C语言中的#include<stdio.h>#include <cstring>#include <string.h>//以上两种都是C语言的string头文件#include <string>//真正的C++头文件在C++中,#inc