-------
一、概述
流只能操作数据。
File对象操作被封装成文件的数据。
1、用来将文件或者文件夹封装成对象。
2、方便对文件和文件夹的属性信息进行操作。
3、File对象可以作为参数传递给流的构造方法,是文件和目录路径的抽象表现形式。
二、方法
File类常见方法:
1、创建。
boolean createNewFile();在指定位置创建文件,如果该文件已经存在,则不创建,返回false。和输出流不一样,输出流对象一建立就创建文件。而且文件已经存在,会覆盖。 需要抛IOException。
boolean mkdir();创建文件夹。
boolean mkdirs();创建多级文件夹。
2、删除。
boolean delete();删除失败返回false。如果文件正在被使用,则删除不了返回false。
void deleteOnExit();在程序退出时删除指定文件。
3、判断。
boolean exists();文件是否存在.
boolean isFile();是文件吗
boolean isDirectory();是目录吗
boolean isHidden();是隐藏文件吗
boolean isAbsolute();是绝对路径吗
boolean canExcute();是可执行文件吗?
4、获取信息。
String getName(); //获取文件名
String getPath(); //获取相对路径
String getParent(); //返回此抽象路径名父目录的路径名
File getAbsoluteFile(); //返回此抽象路径名的绝对路径名,并封装成File类型
String getAbsolutePath(); //获取绝对路径的字符串形式
long lastModified(); //返回此抽象路径名表示的文件最后一次被修改的时间
long length(); //获取长度
5、修改
boolean rename(); //给文件重命名,也可以将文件改名后移动到其他盘符或文件夹中。
如果被移动到的文件夹中已有同名文件,重命名不成功,且不会移动。
6、File.separator(); //跨平台目录分隔符。
File[] listRoots(); //获取机器的有效盘符。
String[] list(); //返回该目录下的所有文件和文件夹(含隐藏),包括其路径表现形式。
Sring[] list(FilenameFilter filter); //返回某一目录下指定类型的文件,FilenameFilter是一个接口类,过滤文件名。
File[] listFiles(); //将返回的文件和文件夹封装成File对象,这样可以对File对象操作,如获取长度、父目录、相对路径等。
三、示例
示例1:文件名过滤:列出给定目录的所有.java文件
public void showFileName(File dir)
{
String[] filenames = dir.list(new FilenameFilter()//匿名内部类
{
public boolean accept(File dir,String name)//复写唯一方法,作用:提取某File对象中符合条件的内容,相当于过滤。
{
return name.endsWith(".java");//列出所有.java文件
}
});
}
示例2:列出指定目录下的所有文件和文件夹(带层次递归)
因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。在列出过程中出现的还是目录的话,还可以再次调用本功能。也就是函数自身调用自身。这种表现形式或者编程手法,称为递归。
递归要注意:
1、一定要限定条件。
2、要注意递归的次数,尽量避免内存溢出。
//递归方法
class DiGui extends Template<String>
{
private String getLevel(int level)
{
StringBuilder sb = new StringBuilder();
sb.append("|--");
for (int i=0; i<level; i++)
sb.insert(0," ");
//System.out.println(sb.toString());
return sb.toString();
}
public void showDir(File dir, List<String> list, int level)
{
list.add(getLevel(level)+dir.getName());
level++;
File[] files = dir.listFiles();
for (File file : files)
{
if (file.isDirectory())
showDir(file,list,level);
else
list.add(getLevel(level)+file.getName());
}
/*
for(int x=0; x<files.length; x++)
{
if(files[x].isDirectory())
showDir(files[x],list,level);
else
list.add(getLevel(level)+files[x].getName());
}
*/
}
public void writeFile(List<String> list, PrintWriter out)
{
for (String s : list)
{
out.println(s);
}
out.close();
}
}
//模版设计模式
abstract class Template<T>
{
public void getRuntime(File dir, List<T> list, int level)
{
long start = System.currentTimeMillis();
showDir(dir,list,level);
long end = System.currentTimeMillis();
System.out.println(end-start);
}
public abstract void showDir(File dir, List<T> list, int level);
}
示例3:删除一个带内容的目录。
原理:在window中,删除目录从里面往外删除的。既然是从里往外删除,就需要用到递归。
public static void removeDir(File dir){
File[] files = dir.listFiles();
for(int x=0; x<files.length; x++)
{
if(files[x].isDirectory( ))//若是目录继续递归
removeDir(files[x]);
else
System.out.println(files[x].toString()+":-file-:"+files[x].delete());
}
System.out.println(dir+"::dir::"+dir.delete());
}
总结:File对象比较简单,记住其方法即可。该章中涉及到了递归,在很多算法中也会用到递归,理解其意义,并注意递归的约束条件:一定要限定递归条件,否则可能后续递归将无法执行,或者会出现死循环。其次要注意递归次数,因为内存有限,若递归次数太多,则可能出现内存溢出。