一.File的常见成员方法(获取并遍历):
二.代码实现:
1.listRoots()方法(返回File数组):获取系统中所有的盘符-->该方法在遍历硬盘时可以用
package com.itheima.a01myfile;
import java.io.File;
import java.util.Arrays;
public class FileDemo7 {
public static void main(String[] args) {
//1.listRoots方法:获取系统中所有的盘符
File[] arr = File.listRoots();
/* listRoots方法是静态的,直接类名.方法名即可调用,
该方法返回一个数组
*/
System.out.println(Arrays.toString(arr));//运行结果为[C:\, D:\]
//Arrays.toString(arr)代表把arr数组转换为字符串
}
}
2.list()方法:获取当前该路径下所有内容(返回String数组)-->仅仅能获取名字:文件是获取文件名加后缀,文件夹是获取文件夹名
package com.itheima.a01myfile;
import java.io.File;
public class FileDemo7 {
public static void main(String[] args) {
/*2.list方法:获取当前该路径下所有内容
-->仅仅能获取名字:文件是获取文件名加后缀,文件夹是获取文件夹名
*/
//该方法返回字符串
File f1=new File("D:\\JavaTest");
String[] arr2 = f1.list();
for (String s : arr2) {
System.out.println(s);
}
}
}
运行结果:
3.list(FilenameFilter filter)方法(返回String数组)-->利用文件名过滤器获取当前该路径下所有内容:
注:FilenameFilter为函数式接口,可以用匿名内部类,也可以改为Lambda表达式,如果有合适的方法还可以用方法引用
package com.itheima.a01myfile;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
public class FileDemo7 {
public static void main(String[] args) {
/*3.list(FilenameFilter filter)方法
-->利用文件名过滤器获取当前该路径下所有内容
*/
File f2=new File("D:\\JavaTest");
String[] arr3 = f2.list(new FilenameFilter() {
/*accept方法的形参,依次表示JavaTest文件夹里面每一个文件或者文件夹的路径
参数一:父级路径
参数二:子级路径
返回值:如果返回值为true,就表示当前路径保留
如果返回值为false,就表示当前路径舍弃不要
*/
@Override
public boolean accept(File dir, String name) {
return false;
}
});
System.out.println(Arrays.toString(arr3));//运行结果为[]
}
}
package com.itheima.a01myfile;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
public class FileDemo7 {
public static void main(String[] args) {
/*3.list(FilenameFilter filter)方法
-->利用文件名过滤器获取当前该路径下所有内容
*/
File f2=new File("D:\\JavaTest");
String[] arr3 = f2.list(new FilenameFilter() {
/*accept方法的形参,依次表示JavaTest文件夹里面每一个文件或者文件夹的路径
参数一:父级路径
参数二:子级路径
返回值:如果返回值为true,就表示当前路径保留
如果返回值为false,就表示当前路径舍弃不要
*/
@Override
public boolean accept(File dir, String name) {
return true;
}
});
System.out.println(Arrays.toString(arr3));
//运行结果为[a.txt, b.txt, ddd, ggg, JavaTest]
}
}
package com.itheima.a01myfile;
import java.io.File;
import java.io.FilenameFilter;
public class FileDemo7 {
public static void main(String[] args) {
/*3.list(FilenameFilter filter)方法
-->利用文件名过滤器获取当前该路径下所有内容
*/
//需求:我现在要获取D:\JavaTest文件夹里面的所有后缀为txt的文件
File f2=new File("D:\\JavaTest");
String[] arr3 = f2.list(new FilenameFilter() {
/*accept方法的形参,依次表示JavaTest文件夹里面每一个文件或者文件夹的路径
参数一:父级路径
参数二:子级路径
返回值:如果返回值为true,就表示当前路径保留
如果返回值为false,就表示当前路径舍弃不要
*/
@Override
public boolean accept(File dir, String name) {
File src=new File(dir,name);//该语句代表拼接出文件对象
System.out.println(src);
return true;
}
});
}
}
运行结果为:
但上述代码没有实现需求获取D:\JavaTest文件夹里面的所有后缀为txt的文件:
解答如下:
法一:
package com.itheima.a01myfile;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
public class FileDemo7 {
public static void main(String[] args) {
/*3.list(FilenameFilter filter)方法
-->利用文件名过滤器获取当前该路径下所有内容
*/
//需求:我现在要获取D:\JavaTest文件夹里面的所有后缀为txt的文件
File f2=new File("D:\\JavaTest");
String[] arr3 = f2.list(new FilenameFilter() {
/*accept方法的形参,依次表示JavaTest文件夹里面每一个文件或者文件夹的路径
参数一:父级路径
参数二:子级路径
返回值:如果返回值为true,就表示当前路径保留
如果返回值为false,就表示当前路径舍弃不要
*/
@Override
public boolean accept(File dir, String name) {
File src=new File(dir,name);//该语句代表拼接出文件对象
/*由于获取的是文件,需要先判断是否为文件,
还必须要满足文件后缀为.txt*/
if(src.isFile() && name.endsWith(".txt")){
return true;
}else {
return false;
}
}
});
System.out.println(Arrays.toString(arr3));//运行结果为[a.txt, b.txt]
}
}
上述代码优化:
package com.itheima.a01myfile;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
public class FileDemo7 {
public static void main(String[] args) {
/*3.list(FilenameFilter filter)方法
-->利用文件名过滤器获取当前该路径下所有内容
*/
//需求:我现在要获取D:\JavaTest文件夹里面的所有后缀为txt的文件
File f2 = new File("D:\\JavaTest");
String[] arr3 = f2.list(new FilenameFilter() {
/*accept方法的形参,依次表示JavaTest文件夹里面每一个文件或者文件夹的路径
参数一:父级路径
参数二:子级路径
返回值:如果返回值为true,就表示当前路径保留
如果返回值为false,就表示当前路径舍弃不要
*/
@Override
public boolean accept(File dir, String name) {
File src = new File(dir, name);//该语句代表拼接出文件对象
/*由于获取的是文件,需要先判断是否为文件,
还必须要满足文件后缀为.txt*/
return src.isFile() && name.endsWith(".txt");//代表只返回是文件且后缀为.txt
}
});
System.out.println(Arrays.toString(arr3));//运行结果为[a.txt, b.txt]
}
}
其中用到了方法endsWith(该方法属于String类),本例中就是让子级路径的后缀为.txt
法二:利用正则表达式
直接用listFiles方法获取该路径下的所有内容(返回File数组),但最后却无法与正则表达式应用
用list方法获取该路径下的所有内容(返回String数组),但最后却无法判断该字符串表示的是否为文件,大大降低了精准度。
因此正则表达式用不了
法三:
package com.itheima.a01myfile;
import java.io.File;
public class FileDemo8 {
public static void main(String[] args) {
//1.创建File对象
File f=new File("D:\\JavaTest");
//需求:打印该路径下所有后缀为.txt的文件
//2.获取该路径下的所有内容
/* 注:要用listFiles,因为只有该方法才能把该路径下的所有内容获取出来,
而list方法:获取当前该路径下所有内容-->仅仅能获取名字,意义不大
*/
File[] arr = f.listFiles();
//3.遍历路径里的内容进行判断输出
for (File file : arr) {
//file依次表示JavaTest文件夹里面的每一个文件或者文件夹的路径
if(file.isFile() && file.getName().endsWith(".txt")){
/* file.isFile()表示判断是否为文件,
file.getName()代表获取文件(不是文件夹)的名称,带后缀,
.endsWith(".txt")代表名称后缀需要是.txt才行
*/
System.out.println(file);
}
}
/*运行结果为:
D:\JavaTest\a.txt
D:\JavaTest\b.txt
*/
}
}
4.listFiles(FileFilter filter)方法(返回File数组)-->利用文件名过滤器获取当前该路径下所有内容:
注:FileFilter为函数式接口,可以用匿名内部类,也可以改为Lambda表达式,如果有合适的方法还可以用方法引用
package com.itheima.a01myfile;
import java.io.File;
import java.io.FileFilter;
import java.util.Arrays;
public class FileDemo9 {
public static void main(String[] args) {
//1.创建File对象
File f=new File("D:\\JavaTest");
//2.调用listFiles方法
File[] arr = f.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
//形参表示依次表示文件夹下的每一个文件或者文件夹的路径
/*返回值就是看当前的路径是否保留:
返回true则保留,保留到listFiles方法返回的数组里
返回false则舍弃*/
return false;
}
});
System.out.println(Arrays.toString(arr));//运行结果为[]
}
}
package com.itheima.a01myfile;
import java.io.File;
import java.io.FileFilter;
import java.util.Arrays;
public class FileDemo9 {
public static void main(String[] args) {
//1.创建File对象
File f=new File("D:\\JavaTest");
//2.调用listFiles方法
File[] arr = f.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) { //形参为完整路径
//形参表示依次表示文件夹下的每一个文件或者文件夹的路径
/*返回值就是看当前的路径是否保留:
返回true则保留,保留到listFiles方法返回的数组里
返回false则舍弃*/
return true;
}
});
System.out.println(Arrays.toString(arr));
/*运行结果为[D:\JavaTest\a.txt, D:\JavaTest\b.txt,
D:\JavaTest\ddd, D:\JavaTest\ggg, D:\JavaTest\JavaTest]*/
}
}
package com.itheima.a01myfile;
import java.io.File;
import java.io.FileFilter;
import java.util.Arrays;
public class FileDemo9 {
public static void main(String[] args) {
//1.创建File对象
File f=new File("D:\\JavaTest");
//2.调用listFiles方法
File[] arr = f.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
//形参表示依次表示文件夹下的每一个文件或者文件夹的路径
/*返回值就是看当前的路径是否保留:
返回true则保留,保留到listFiles方法返回的数组里
返回false则舍弃*/
return pathname.isFile() && pathname.getName().endsWith(".txt");
//此时返回的是后缀为.txt的文件,结果为true则保留,结果为false则舍弃
}
});
System.out.println(Arrays.toString(arr));
/*运行结果为[D:\JavaTest\a.txt, D:\JavaTest\b.txt]*/
}
}
5.listFiles(FilenameFilter filter)方法(返回File数组)-->利用文件名过滤器获取当前该路径下所有内容:
注:FilenameFilter为函数式接口,可以用匿名内部类,也可以改为Lambda表达式,如果有合适的方法还可以用方法引用
package com.itheima.a01myfile;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
public class FileDemo10 {
public static void main(String[] args) {
//1.创建File对象
File f=new File("D:\\JavaTest");
//2.调用
File[] arr = f.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
//第一个形参是父级路径,第二个形参是子级路径(相当于把完整的路径拆成父级和子级两部分)
/* 本例中D:\JavaTest为父级路径,其中ggg为一个子级路径
父级路径加上子级路径就是一个完整的路径
*/
File src = new File(dir, name);
return src.isFile() && name.endsWith(".txt");
/*return src.isFile() && src.getName().endsWith(".txt");也行
但形参里已经有子级路径且为字符串,直接用name.endsWith(".txt");更简洁
*/
}
});
System.out.println(Arrays.toString(arr));
//运行结果为[D:\JavaTest\a.txt, D:\JavaTest\b.txt]
}
}