前言:从这一讲开始,我们走进I/O流的世界,领略该体系中繁多的对象。I/O流这一块在Java基础中所占的比例还是蛮大的,所以,硬着头皮也要啃下它!少年,出发吧!
设备(比如说硬盘)上的数据,最常见的存储表现形式是文件(即File),所以这一讲中,我们学习一下文件的基本操作。
File类的概述
文件和目录路径名的抽象表示形式,用于表示一个文件或文件夹,并提供了一系列操作文件或文件夹的方法。
你必须要知道的File类中的方法和字段
构造方法
方法 | 功能描述 |
---|---|
File(String pathname) | 根据路径得到File对象 |
File(String parent,String child) | 根据目录和子文件/目录得到对象 |
File(File parent,String child) | 根据父File对象和子文件/目录得到对象 |
从上表可以知道,创建File对象有三种方法,下面我会给出示例代码。
public class FileDemo {
public static void main(String[] args) {
//将具体的路径封装成了File对象。可以封装存在的文件或目录,也可以封装不存在的文件或目录
File file = new File("c:\\1.txt");
//File(String parent, String child)
File file1 = new File("c:\\", "1.txt");
File dir = new File("c:\\");
File file2 = new File(dir, "1.txt");
}
}
需要注意的是将具体的路径(比如a.txt
)封装成File对象时,可以将已有和未出现的文件或文件夹封装成对象。
我们在打印时,new File(...)
封装的是什么,就会打印什么。
输出语句 | 打印结果 |
---|---|
System.out.println(“file:”+file); | file:c\1.txt |
System.out.println(“file1:”+file1); | file1:c\1.txt |
System.out.println(“file2:”+file2); | file2:c\1.txt |
separator字段
与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串,该字段是跨平台的。所以我们也可以这样来创建File对象:
File f = new File("c:" + File.separator + "abc" + File.separator + "1.txt");
创建功能
返回值 | 方法 | 功能描述 |
---|---|---|
boolean | createNewFile() | 在指定位置创建文件,如果该文件已经存在,则不创建,返回false;不存在,就会创建,创建成功并返回true。和输出流不一样,输出流对象一建立就创建文件,而且文件已经存在,会覆盖。 |
boolean | mkdir() | 创建文件夹,但只能创建一级目录。 |
boolean | mkdirs() | 创建多级文件夹。 |
示例代码如下:
public class FileDemo {
public static void main(String[] args) throws IOException {
//需求:我要在F盘下新建一个a.txt文件。
File file = new File("f:\\a.txt");
System.out.println("createNewFile:" + file.createNewFile());//如果文件存在,则不创建并返回false,不存在就创建,成功就返回true。
//需求:我要在F盘下新建一个demo文件夹。
File file1 = new File("f:\\demo");
System.out.println("mkdir:" + file1.mkdir());
//需求:我要在F盘下新建一个多级目录(F:\a\b\c\d)
File file2 = new File("f:\\a\\b\\c\\d");
System.out.println("mkdirs:" + file2.mkdirs());//创建多级目录。
}
}
删除功能
返回值 | 方法 | 功能描述 |
---|---|---|
boolean | delete() | 删除文件或文件夹,删除失败返回false,删除文件夹时,必须保证该文件夹没有内容,如果有内容,必须先把内容删除后,才可以删除当前文件夹。 |
示例代码如下:
public class FileDemo {
public static void main(String[] args) throws IOException {
//需求:我要在C盘下新建一个a.txt文件。
File file = new File("f:\\a.txt");
System.out.println("createNewFile:" + file.createNewFile());
boolean b = file.delete();
System.out.println("delete:" + b);//删除方法要慎用,其不走回车站。并且删除一个不存在的文件,返回false。
//注意:删除文件夹时,必须保证该文件夹中没有内容,有内容,必须先把内容删除后,才可以删除当前文件夹。
}
}
判断功能
方法 | 功能描述 |
---|---|
exists() | 判断文件(夹)是否存在 |
isDirectory() | 判断是否是一个目录 |
isFile() | 判断是否是一个标准文件。记住在判断文件对象是否是文件或者目录时,必须要先判断该文件对象封装的内容是否存在,通过exists()判断 |
isAbsolute() | 判断是否为绝对路径 |
isHidden() | 判断是否是一个隐藏文件 |
canExecute() | 测试应用程序是否可以执行此抽象路径名表示的文件 |
示例代码如下:
public class FileDemo {
public static void main(String[] args) throws IOException {
File file = new File("a.txt");
boolean b = file.createNewFile();
System.out.println("exists:" + file.exists());//true
System.out.println("isDirectory:" + file.isDirectory());//false
System.out.println("isFile:" + file.isFile());//true
System.out.println("isAbsolute:" + file.isAbsolute());//false
System.out.println("isHidden:" + file.isHidden());//false
System.out.println("canExecute:" + file.canExecute());//true
}
}
获取功能
返回值 | 方法 | 功能描述 |
---|---|---|
String | getName() | 获取文件或目录的名称 |
long | length() | 获取文件的大小 |
String | getParent() | 该方法返回的是绝对路径中的父目录,如果获取的是相对路径,返回null。如果相对路径中有上一层目录,那么该目录就是返回结果 |
String | getAbsolutePath() | 该方法返回的是文件对象的绝对路径,即使封装的是相对的,获取到的也是绝对的 |
String | getPath() | 返回的就是File类构造函数里面的字符串,不管什么绝对或相对路径,你给我什么,我就返回什么 |
long | lastModified() | 文件最后一次被修改的时间 |
long | getFreeSpace() | 获取剩余可用空间大小 |
long | getTotalSpace() | 获取总空间大小 |
示例代码如下:
public class FileDemo {
public static void main(String[] args) throws IOException {
File file = new File("abc\\1.txt");
String file_name = file.getName();
System.out.println(file_name);
long len = file.length();
System.out.println(len);
System.out.println(file.getParent());
String path = file.getAbsolutePath();//获取文件对象的绝对路径,即使封装的是相对的(相对的是项目路径),获取到的也是绝对的。
String path1 = file.getPath();//获取的是File对象中封装的路径,封装的是什么,获取到的就是什么。
System.out.println("path = " + path);
System.out.println("path1 = " + path1);
long time = file.lastModified();
Date date = new Date(time);
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
String str_date = dateFormat.format(date);
System.out.println(str_date);
}
}
运行结果:
高级获取功能
返回值 | 方法 | 功能描述 |
---|---|---|
static File[] | listRoots() | 列出可用的文件系统根 |
String[] | list() | 列出当前目录下的所有文件和文件夹名称,包含隐藏文件。注意:调用list()方法的File对象必须是封装了一个目录,而且该目录还必须存在 |
File[] | listFiles() | 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。如果目录为空,那么数组也将为空。如果此抽象路径名不表示一个目录,或者发生I/O错误,则返回null |
首先,来看一下listRoots()方法,示例代码如下:
public class FileDemo {
public static void main(String[] args) {
File[] files = File.listRoots();
for (File f : files) {
System.out.println(f);
}
}
}
运行以上代码,会输出计算机可用盘符,诸如下面这样:
然后,再来看一下list()方法与listFiles()方法,示例代码如下:
public class FileDemo {
public static void main(String[] args) {
//获取指定文件夹中的所有文件和文件夹的名称
//File dir = new File("c:\\StringDemo.java");//如果此抽象路径名不表示一个目录,那么此方法将返回 null。
//File dir = new File("c:\\abc");//如果文件夹存在,但是里面没内容,它会返回一个长度为0的数组。
File dir = new File("c:\\");
String[] names = dir.list();//可以列出当前目录下的所有文件和文件夹名称,包含隐藏文件。
//只获取名称。
//System.out.println(names);
if (names != null)
for (String name : names) {
System.out.println(name);
}
System.out.println("----------------------------");
File dir1 = new File("c:\\");
File[] files = dir1.listFiles();
for (File f : files) {
System.out.println(f.getName() + "......" + f.length());
}
}
}
文件名过滤器
返回值 | 方法 | 功能描述 |
---|---|---|
String[] | list(FilenameFilter filter) | 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。用途:专门查找指定目录下指定后缀名(例如:.java/.jpg/.mp3/.log)的文件 |
现有一个需求:能不能只获取指定目录下的.java文件呢?要想解决这个需求,就需要使用到list(FilenameFilter filter)这个方法了。
首先创建一个根据文件名称的后缀名进行过滤的过滤器。
/** * 根据文件名称的后缀名进行过滤的过滤器。 * @author 李阿昀 * */ public class FilterBySuffix implements FilenameFilter { private String suffix; public FilterBySuffix(String suffix) { super(); this.suffix = suffix; } /** * dir:被过滤的目录。 * @param name:被遍历目录中的文件或者文件夹的名称。 * or 在遍历过程中,所遍历到的每一个文件或者文件夹的名字。 */ @Override public boolean accept(File dir, String name) { return name.endsWith(suffix); } }
接着在list(FilenameFilter filter)方法中传入该过滤器对象。
public class FilenameFilterDemo { public static void main(String[] args) { //能不能只获取指定目录下的.java文件呢?要想实现这个,需要使用到list(FilenameFilter filter)这个方法。 //创建一个过滤器对象。 File dir = new File("c:\\"); //传入一个过滤器。 FilenameFilter filter = new FilterBySuffix(".java");//过滤后缀名的过滤器。 String[] names = dir.list(filter); for (String name : names) { System.out.println(name); } } }
文件过滤器
返回值 | 方法 | 功能描述 |
---|---|---|
File[] | listFiles(FileFilter filter) | 获取指定目录下的所有文件或文件夹的File数组 |
其实要解决上面的需求,也可以使用listFiles(FileFilter filter)这个方法。
首先创建一个根据文件名称的后缀名进行过滤的过滤器。
public class FilterByFile implements FileFilter { @Override public boolean accept(File pathname) { return pathname.getName().endsWith(".java"); } }
接着在listFiles(FileFilter filter)方法中传入该过滤器对象。
public class FileFilterDemo { public static void main(String[] args) { /* * 文件过滤器:FileFilter。 */ File dir = new File("c:\\"); //传递一个过滤器。 FileFilter filter = new FilterByFile(); File[] files = dir.listFiles(filter); for (File file : files) { System.out.println(file); } } }
关于File类的讲述,我暂时讲到这里,下一讲,打算粗略讲一讲递归这一非常重要的编程思想,其中也涉及到了File类。