应用Alt + /对变量调用方法进行快速打印:选中要打印的内容,按Alt + /选最后一个选项。
方法介绍中,未明确指明对文件或目录进行操作,则两者皆可。
目录
File类的概述
File类的构造方法
File类的创建功能
File类的重命名和删除功能
File类的判断功能
File类的获取功能
案例演示:输出指定目录下指定后缀的文件名
文件名称过滤器的概述
文件名称过滤器的使用
递归
递归练习
File类的概述
public class File extends Object implements Serializable, Comparable<File>,文件和目录路径名的抽象表示形式。用户界面和操作系统使用与系统相关的路径名字符串来命名文件和目录。
java.io包下,使用需要导包。
File更应该叫做一个路径,代表文件路径或者文件夹路径。
路径分为绝对路径和相对路径:
绝对路径是一个固定的路径,从盘符开始。
相对路径相对于某个位置,在eclipse下是指当前项目下,在dos下指的是当前路径。
File类的构造方法
File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新File实例。(根据一个路径得到File对象)
File(String parent, String child) 根据parent路径名字符串和child路径名字符串创建一个点File实例。(根据一个目录和一个子文件/目录得到File对象)
File(File parent, String child) 根据parent抽象路径名和child路径名字符串创建一个新file实例。(根据一个父File对象和一个子文件/目录得到File对象)
案例演示:File类的构造方法。
import java.io.File;
public class Demo1_File {
public static void main(String[] args) {
//File(String pathname)
/*File file = new File("G:\\01、第一阶段Java基础\\day19\\day19\\video\\19.14_File类(File类的概述和构造方法).avi"); // \转义字符 \\路径分隔符 传入一个相对路径。
System.out.println(file.exists()); //检查文件是否存在。 选中file.exists() 按Alt + / 选最后一个。
File file2 = new File("xxx.txt"); //传入一个绝对路径,该文件就在此项目下。
System.out.println(file2.exists());
File file3 = new File("yyy.txt");
System.out.println(file3.exists()); //false,不存在。
*/
//File(String parent, String child)
/*String parent = "G:\\01、第一阶段Java基础\\day19\\day19\\video";
String child = "19.14_File类(File类的概述和构造方法).avi"; //分开,child可以记录不同的子文件/目录
File file = new File(parent, child);
System.out.println(file.exists());*/
//File(File parent, String child)
File parent = new File("G:\\01、第一阶段Java基础\\day19\\day19\\video"); //将父级路径封装成File对象,可以使用File中的一些功能,比String更强大一些。
String child = "19.14_File类(File类的概述和构造方法).avi";
File file = new File(parent, child);
System.out.println(file.exists());
System.out.println(parent.exists());
}
}
File类的创建功能
public boolean createNewFile() 创建文件,如果存在这样的文件,就不创建了。
public boolean mkdir() 创建文件夹,如果存在这样的文件夹,就不创建了。
public boolean mkdirs() 创建多级文件夹,如果父文件夹不存在,会帮你创建出来。
案例演示:File类的创建功能。
import java.io.File;
import java.io.IOException;
public class Demo2_FileMethod {
public static void main(String[] args) throws IOException {
//public boolean createNewFile()
/*File file = new File("yyy.txt");
System.out.println(file.createNewFile()); //避免因错误路径错误产生异常,故在方法上抛出IOException。 没加盘符的情况下, 如果没看到生成的文件,选中该项目,按F5刷新即可。 如果没有就创建,返回true;如果有就不创建,返回false。
File file2 = new File("zzz"); //不加后缀也可以创建文件。但最好加上,方便判断打开此文件的软件。
System.out.println(file2.createNewFile());*/
//public boolean mkdir()
/*File dir1 = new File("aaa");
System.out.println(dir1.mkdir()); //无则建返true,有不建返false。 F5刷新项目。
File dir2 = new File("bbb.txt"); //文件夹也可以有后缀,但一般不这么定义。
System.out.println(dir2.mkdir());*/
//public boolean mkdirs()
File dir1 = new File("ccc\\ddd"); //创建多级目录。
System.out.println(dir1.mkdirs());
}
}
注意事项:如果你创建文件或者文件夹忘了写盘符路径。那么,被当作相对路径,默认在项目路径下。
File类的重命名和删除功能
public boolean renameTo(File dest) 把文件重命名为指定的文件路径。也可以用来剪切。
public boolean delete() 删除文件或者文件夹。
重命名注意事项:
如果路径名相同,就是改名。如果路径名不同,就是改名并剪切。
删除注意事项:
Java中的删除不走回收站。
要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹(文件夹必须为空)。Windows中删除文件夹是先将文件夹中的每一个文件/子目录删除,再删文件夹。
案例演示:File类的重命名和删除功能。
import java.io.File;
public class Demo3_FildMethod {
public static void main(String[] args) {
//public boolean renameTo(File dest)
/*File file1 = new File("xxx.txt");
File file2 = new File("ooo.txt"); //改名
*/
/*File file1 = new File("ooo.txt");
File file2 = new File("G:\\xxx.txt"); //改名并剪切
System.out.println(file1.renameTo(file2));*/
//public boolean delete()
File file1 = new File("yyy.txt"); //删除文件yyy.txt
System.out.println(file1.delete());
File file2 = new File("aaa"); //删除目录aaa
System.out.println(file2.delete());
File file3 = new File("ccc");
System.out.println(file3.delete()); //ccc删除失败,因为他还有子目录ddd,文件夹不为空。
}
}
File类的判断功能
public boolean isDirectory() 判断是否是目录。
public boolean isFile() 判断是否是文件。
public boolean exists() 判断是否存在。
public boolean canRead() 判断是否可读。
public boolean canWrite() 判断是否可写。
public boolean isHidden() 判断是否隐藏。
补充方法:
public boolean setReadable(boolean readable) 一种方便的方法来设置所有者对此路径名的读取权限。
public boolean setWritable(boolean writable) 一种方便的方法来设置所有者对此路径名的写入权限。
案例演示:File类的判断功能。
import java.io.File;
public class Demo4_FileMethod {
public static void main(String[] args) {
/* //public boolean isDirectory()
File dir1 = new File("ccc");
System.out.println(dir1.isDirectory()); //true,ccc是一个文件夹。
File dir2 = new File("zzz");
System.out.println(dir2.isDirectory()); //false,zzz是一个文件,不是文件夹。
//public boolean isFile()
System.out.println(dir1.isFile()); //false,ccc不是一个文件。
System.out.println(dir2.isFile()); //true,zzz是一个文件。
*/
//public boolean canRead()
File file = new File("zzz");
file.setReadable(false); //设置是否可读。
System.out.println(file.canRead()); //true,可读。设置未起作用,因为Windows系统认为所有的文件都是可读的。所以,无论setReadable()设置true还是false,都是可读的。
//public boolean canWrite()
file.setWritable(false); //设置是否可写。
System.out.println(file.canWrite());//false,不可写。设置起作用了。Windows系统可以设置为不可写。
//public boolean isHidden()
File file2 = new File("aaa.txt");
System.out.println(file2.isHidden());//true,文件是隐藏的。
System.out.println(file.isHidden()); //false,文件非隐藏。
}
}
File类的获取功能
public String getAbsolutePath() 获取绝对路径。
public String getPath() 获取构造方法里传入的路径。传的相对路径获取的就是相对路径,传的绝对路径获取的就是绝对路径。
public String getName() 获取名称。
public long length() 获取长度。长度即字节数。
public long lastModified() 获取最后一次的修改时间,毫秒值。
public String[] list() 获取指定目录下的所有文件或者文件夹的名称数组。
public File[] listFiles() 获取指定目录下的所有文件或者文件夹的File(文件对象)数组 。
案例演示:File类的获取功能。
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo5_FileMethod {
public static void main(String[] args) {
/* //public String getAbsolutePath()
File file1 = new File("ccc.txt"); //将ccc.txt封装成一个File对象。
File file2 = new File("C:\\Users\\Administrator\\eclipse-workspace\\day19\\ccc.txt");
System.out.println(file1.getAbsolutePath()); //获取绝对路径C:\Users\Administrator\eclipse-workspace\day19\ccc.txt
System.out.println(file2.getAbsolutePath()); //获取绝对路径C:\Users\Administrator\eclipse-workspace\day19\ccc.txt
//public String getPath()
System.out.println(file1.getPath()); //获取构造方法里传入的相对路径ccc.txt
System.out.println(file2.getPath()); //获取构造方法里传入的绝对路径C:\Users\Administrator\eclipse-workspace\day19\ccc.txt
//public String getName()
System.out.println(file1.getName()); //获取文件/目录名称ccc.txt
System.out.println(file2.getName()); //获取文件/目录名称ccc.txt
//public long length()
System.out.println(file1.length()); //获取长度 7 右键文件-Properties-Resource-size也能看到
//public long lastModified()
System.out.println(file1.lastModified()); //获取最后修改时间,以毫秒值的形式返回1543061114858 右键文件-Properties-Resource-Last modified也能看到
//通过最后修改时间的毫秒值获取具体时间
Date d = new Date(file1.lastModified());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
System.out.println(sdf.format(d)); //2018年11月24日 20:05:14
*/
//public String[] list()
File dir = new File("G:/01、第一阶段Java基础/day19/day19/video"); // \\路径分隔符 /也是路径分隔符
String[] arr = dir.list();
for (String string : arr) {
System.out.println(string); //把指定目录下所有的文件名称全部获取,仅为了获取名字。
}
//public File[] listFiles()
File[] subFiles = dir.listFiles();
for (File file : subFiles) {
System.out.println(file); //把指定目录下所有的文件全路径全部获取,全路径是因为File类重写了toString(),所以打印引用时,返回全路径。但我们其实可以对每一个file对象添加操作。所以实际获取的是文件对象。
}
}
}
案例演示:输出指定目录下指定后缀的文件名
需求:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称。
import java.io.File;
/**
* 需求:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称。
*/
public class Test3 {
public static void main(String[] args) {
File dir = new File("H:/");
/*String[] arr = dir.list(); //获取H盘下所有的文件和目录,但不能获取子目录内的文件/目录
for (String string : arr) {
if(string.endsWith(".png")) {
System.out.println(string);
}
}*/
//开发用这种
File[] subFiles = dir.listFiles(); //获取H盘下所有的文件和文件夹对象
for (File subFile : subFiles) {
if(subFile.isFile() && subFile.getName().endsWith(".png")) {
System.out.println(subFile);
}
}
}
}
文件名称过滤器的概述
public String[] list(FilenameFilter filter) 返回一个字符串数组,这些字符串指定此路径名表示的目录中满足过滤器的文件和目录。
public File[] listFiles(FileFilter filter) 返回路径名数组,这些路径名表示此路径名表示的目录中满足指定过滤器的文件和目录。
接口FilenameFilter概述:
public interface FilenameFilter,实现此接口的类实例可用于过滤器文件名。java.io包下,使用需要导包。
接口FilenameFilter方法:
public boolean accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中。
文件名称过滤器的使用
需求:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称。
源码分析:带文件名称过滤器的list()方法的源码。
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
public class Demo6_FilenameFilter {
public static void main(String[] args) {
File dir = new File("H:/");
String[] arr = dir.list(new FilenameFilter() { //用匿名内部类传接口子类对象 过滤器是把符合条件的拿出来存储到数组里,这用就不用遍历数组再找符合条件了
public boolean accept(File dir, String name) { //dir传入的路径,name文件/目录的名字
File file = new File(dir, name);
return file.isFile() && file.getName().endsWith(".png");
}
});
for (String string : arr) {
System.out.println(string);
}
//源码,底层用过滤器实现的。
/*public String[] list(FilenameFilter filter) {
String names[] = list(); //无参list()会把当前文件夹下的所有文件/目录都拿到
if ((names == null) || (filter == null)) {
return names;
}
List<String> v = new ArrayList<>();
for (int i = 0 ; i < names.length ; i++) {
if (filter.accept(this, names[i])) { //this指文件对象,names[i]相当于每一个文件。 文件路径+文件名。
v.add(names[i]); //if判断为true,就将文件名添加到集合v中。
}
}
return v.toArray(new String[v.size()]); //将集合转成数组,指定长度为集合v的size,并返回。
}*/
}
}
递归
递归:
方法自己调用自己。
弊端:
如果方法调用次数过多,容易导致栈内存溢出StackOverFlowError。
好处:
不用知道循环次数。
问题1:构造方法是否可以递归调用?
不可以。构造方法是创建对象的时候系统自己去调用,调用后构造方法又调用自己,死循环。
问题2:递归是否必须有返回值?
不一定(可以有,也可以没有)。没有的情况:根据路径找指定类型的文件,只需要把符合条件的打印出来,无需返回。
练习:5的阶乘。
/**
* 练习:5的阶乘。
* 分析:5! = 5 * 4 * 3 * 2 * 1
*
* 5 * fun(4)(代表4!)
* 4 * fun(3)(代表3!)
* 3 * fun(2)(代表2!)
* 2 * fun(1)(代表1!)
*/
public class Demo10_Digui {
public static void main(String[] args) {
//for循环实现5的阶乘
/* int result = 1;
for (int i = 1; i <= 5; i++) {
result = result * i;
}
System.out.println(result);
*/
System.out.println(fun(5)); //算到int最大值时,再往上加就溢出了,没有办法再求了,所以结果为0,例如1000!
}
public static int fun(int num) {
if(num == 1) {
return 1;
}else {
return num * fun(num - 1);
}
}
}
递归练习
需求:从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.java文件名。
import java.io.File;
import java.util.Scanner;
/**
* 需求:从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.java文件名。
* 分析:
* 从键盘输入接收一个文件夹路径
* 1.从键盘接收一个文件夹路径(可能接收到的路径:不存在的路径、文件路径、文件夹路径)。
* 2.如果录入的是不存在的路径,给予提示。
* 3.如果录入的是文件路径,给予提示。
* 4.如果录入的是文件夹路径,直接返回。
* 打印出该文件夹下所有的.java文件名
* 5.获取到给文件夹路径下的所有文件和文件夹,存储在File数组中。
* 6.遍历数组,对每一个文件或文件夹做判断。
* 7.如果是文件,并且后缀是.java的,就打印。
* 8.如果是文件夹,就递归调用。
*/
public class Test5 {
public static void main(String[] args) {
File dir = getDir(); //获取文件夹路径
printJavaFile(dir);
}
/*
* 获取键盘录入的文件夹路径
* 1.返回值类型: File
* 2.参数列表:不需要
*/
public static File getDir() {
//1.从键盘接收一个文件夹路径(可能接收到的路径:不存在的路径、文件路径、文件夹路径)。
Scanner sc = new Scanner(System.in); //创建键盘录入对象
System.out.println("请输入一个文件夹路径");
while(true) {
String line = sc.nextLine(); //将键盘录入的文件夹路径存储
File dir = new File(line); //封装成File对象
//2.如果录入的是不存在的路径,给予提示。
if(!dir.exists()) {
System.out.println("您录入的文件夹路径不存在,请重新录入文件夹路径:");
//3.如果录入的是文件路径,给予提示。
}else if(dir.isFile()) {
System.out.println("您录入的是文件路径,请重新录入文件夹路径");
//4.如果录入的是文件夹路径,直接返回。
}else {
return dir;
}
}
}
/*
* 获取文件夹路径下的所有 .java文件
* 1.返回值类型:void
* 2.参数列表:File dir
*/
public static void printJavaFile(File dir) {
//5.获取到给文件夹路径下的所有文件和文件夹,存储在File数组中。
File[] subFiles = dir.listFiles();
//6.遍历数组,对每一个文件或文件夹做判断。
for (File subFile : subFiles) {
//7.如果是文件,并且后缀是.java的,就打印。
if(subFile.isFile() && subFile.getName().endsWith(".java")) {
System.out.println(subFile);
//8.如果是文件夹,就递归调用。
}else if(subFile.isDirectory()) {
printJavaFile(subFile);
}
}
}
}