————————下面是整个演示源代码-------------------------------------------------
[java] view plain copy
package com.lj95801.iosystem;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.regex.Pattern;
import org.junit.Test;
public class tFile1 {
/*
- File类的构造函数有以下几种:
- 1)、File(File parent, String child);
- 2)、File(String pathname)
- 3)、File(String parent, String child)
-
4)、File(URI uri)
*/
@Test
public void test1(){
//1、new File(".")构建的是当前目录的路径
File path = new File(".");
String[] list = path.list();
for(String itemName : list){
System.out.println(itemName);
}
//2、new File("E:\Java")利用绝对路径构建E盘下的Java目录路径
System.out.println("--------->");
path = new File("E:\Java");
list = path.list();
for(String itemName : list){
System.out.println(itemName);
}
//3、new File(new File("."),"bin")表示当前目录下的bin目录
System.out.println("--------->");
path = new File(new File("."),"bin");
list = path.list();//列出bin目录下的所有文件或者是文件夹
for(String itemName : list){
System.out.println(itemName);
}
}/*
- list()方法 : 会返回一个字符数组,将制定路径下的文件或文件夹名(仅仅是个名字而已)存储到String数组中。有以下几种:
- 1)、list()
- 2)、list(FilenameFilter filter)
- FilenameFilter filter是一个目录过滤器。list(FilenameFilter filter)方法会选择
- 符合条件的文件或文件夹。为了能理解这个函数的工作原理,下面列出了其源码:
-
public String[] list(FilenameFilter filter) {
String names[] = list();
if ((names == null) || (filter == null)) {
return names;
}
ArrayList v = new ArrayList();
for (int i = 0 ; i < names.length ; i++) {
if (filter.accept(this, names[i])) {
v.add(names[i]);
}
}
return (String[])(v.toArray(new String[v.size()]));
}*我们再往前追踪一下,看看FilenameFilter到底是怎样的,同时其accept()方法又有什么作用:
-
interface FilenameFilter {
- Tests if a specified file should be included in a file list.
- @param dir the directory in which the file was found.
- @param name the name of the file.
- @return <code>true</code> if and only if the name should be
-
included in the file list; <code>false</code> otherwise.
boolean accept(File dir, String name);
}
-
我们可以看到,FilenameFilter只是一个接口,所以如果要用list(FilenameFilter filter)方法
我们必须要实现这样的一个接口。accept()方法会返回一个boolean类型的值,list()方法会根据这个返回值
*来决定是不是要将某个名字添加到返回列表中。所以,我们要在accept()方法中定义好挑选条件,这会用到正则表达式。 -
*/
//一、采用实现接口的方式
class FileNameFilter1 implements FilenameFilter{
private Pattern pattern;public FileNameFilter1(String regex) { pattern = Pattern.compile(regex); } @Override public boolean accept(File dir, String name) { boolean result = pattern.matcher(name).matches(); return result; }
}
/*
- 二、采用匿名内部类的方式。
- 不用implements的方式来实现接口,但是定义一个静态方法,此静态方法返回一个FilenameFilter对象,
- 本来正常的语句是return new FilenameFilter();但是在语句结束之前我说“等一下,我要在这里定义
-
一个类,类的具体实现我用一个大括号括起来”。
*/
static class FileNameFilter2{
public static FilenameFilter filter(final String regex){
return new FilenameFilter(){
private Pattern pattern = Pattern.compile(regex);@Override public boolean accept(File dir, String name) { return pattern.matcher(name).matches(); } }; }
}
@Test
public void test2(){
System.out.println("------挑选当前目录下以.开头的文件或文件夹-------");
//1、挑选当前目录下以.开头的文件或文件夹,并且打印出来(创建一个类来实现FilenameFilter接口)
File path = new File(".");
String[] nameList = path.list(new FileNameFilter1("\..*"));
for(String itemName : nameList){
System.out.println(itemName);
}System.out.println("------挑选当前目录下以b开头的文件或文件夹-------"); //2、挑选当前目录下以b开头的文件或文件夹,并且打印出来(使用匿名内部类的方式来实现) File path2 = new File("."); String[] nameList2 = path2.list(FileNameFilter2.filter("b.*")); for(String itemName : nameList2){ System.out.println(itemName); } System.out.println("------挑选当前目录下以s开头的文件或文件夹-------"); //3、将匿名内部类利用到极致 File path3 = new File("."); String[] nameList3 = path3.list(new FilenameFilter(){//其实是在第二种方式的基础上精简过来的。 private Pattern pattern = Pattern.compile("s.*"); @Override public boolean accept(File dir, String name) { return pattern.matcher(name).matches(); } }); for(String itemName : nameList3){ System.out.println(itemName); }
}
/*
- list()和listFiles()方法的区别在于:list()返回的是一个String类型数组,它只是一个数组;
- 而listFiles()方法返回的是一个File类的引用,它具有类的所有属性和方法。
- 下面的前三个方法返回File[]类型,第四个返回static File[]类型。
- 返回类型 : 该路径下所有文件或文件夹的绝对路径(pathname,注意File类型指的是路径,而不是文件)
- listFiles()
- listFiles(FileFilter filter)
- listFiles(FilenameFilter filter)
- listRoots()
-
*/
@Test
public void test3(){
System.out.println("-----判别当前目录下的文件是否为文件夹----");
//1、列出当前目录下的所有文件和文件夹,保存为File类对象的数组,判别其是否为文件夹
File path = new File(".");
File[] files = path.listFiles();
for(File f : files){
System.out.println(f + " ---> is a Directory? " + f.isDirectory());
}System.out.println("-----挑选出当前目录下的所有文件夹----"); //2、挑选出当前目录下的所有文件夹 File path2 = new File("."); File[] files2 = path2.listFiles(new FileFilter(){ @Override public boolean accept(File pathname) { return pathname.isDirectory(); } }); for(File f : files2){ System.out.println(f); } System.out.println("-----挑选出当前目录下的所有以s开头的文件夹----"); //2、挑选出当前目录下的所有以s开头的文件夹 File path3 = new File("."); File[] files3 = path3.listFiles(new FileFilter(){ @Override public boolean accept(File pathname) { Pattern pattern = Pattern.compile("s.*"); return pathname.isDirectory()&&pattern.matcher(pathname.getName()).matches(); } }); for(File f : files3){ System.out.println(f); } System.out.println("-----挑选出当前目录下的所有以.开头的文件夹,并且标明文件属性----"); //3、挑选出当前目录下以.开头的文件或文件夹,并且在其后部标明f/d标明其为文件或文件夹 File path4 = new File("."); File[] files4 = path4.listFiles(new FilenameFilter(){ Pattern pattern = Pattern.compile("\\..*"); @Override public boolean accept(File dir, String name) { return pattern.matcher(name).matches(); } }); for(File f : files4){ String sfd = (f.isFile()) ? "f" : "d"; System.out.println(f.getName() + "---->" + sfd); }
}
}
补充:
java.io.File用于表示文件(目录)<br>
File类只用于表示文件(目录)的信息(名称、大小等),不能用于文件内容的访问
file.getName()返回文件名<br>
file.getAbsolutePath()返回文件路径<br>
file.isDirectory()返回是否是目录
file.isFile()返回时否是文件
file.mkdir()创建目录<br>
file.mkdirs()创建多层子目录<br>
file.exist()返回是否文件是否存在<br>
file.delete()删除文件
文件导入一定用双斜杠//
构建file对象时对于文件的路径分隔符有三种方式 / \ file的静态变量(这个最好,适用于多种操作系系统)
package com.imooc;
import java.io.File;
import java.io.IOException;
public class FlieDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//了解构造函数的几种情况
File file=new File("D:\\迅雷下载\\imooc");
//System.out.println(file.exists());
if(!file.exists())
file.mkdir();
//else
//file.delete();
//是否是一个目录,如果不是目录或目录不存在,返回false
System.out.println(file.isDirectory());
//是不是一个文件
System.out.println(file.isFile());
//File file2=new File("D:\\迅雷下载\\imooc\\1.txt");
File file2=new File("D:\\迅雷下载\\imooc","1.txt");
if(!file2.exists()){
try {
file2.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else
file2.delete();
}
}