File类是java.io代表与平台无关的文件和目录,也就是说,如果希望在程序中操作文件和目录,都可以通过File类来完成。
但是File类只能新建,删除,重命名文件和目录,并不能访问文件内容本身。
如果需要访问文件内容本身,则需要使用输入输出流
File类常见方法
创建。
—boolean createNewFile():在指定目录下创建文件,如果该文件已经存在,则不创建。
在createNewFile()函数前面都会有一行创建File类对象的代码:
File file=new File(“file.txt”);
boolean b=file.createNewFile();
—boolean mkdir():试图创建一个File对象所对应的目录,如果创建成功,则返回true。
调用该方法时File对象必须对应一个路径而不是一个文件。
File dir=new File(“abc”);
boolean a=dir.mkdir();
—boolean mkdirs():创建多级目录。
调用该方法时File对象对应一个路多级径而不是一个文件。
File dirs=new File(“abcd\f\d\hh\w\t\s”);
boolean c=dirs.mkdirs();删除。
—boolean delete():删除File对象所对应的文件或路径。
—void deleteOnExit():注册一个删除钩子,指定当Java虚拟机退出时,删除File对象所对应的文件和目录。
注意:在删除文件夹时,必须保证这个文件夹里没有任何内容,才可以用delete来删除文件夹,否则就会删除失败,因为Windows删除文件是从里往外进行的。获得。
long length():获取文件大小。
String getName():返回由此抽象路径名表示的文件或目录的名称。
String getPath():将此抽象路径名转换为一个路径名字符串。
String getAbsolutePath():返回此抽象路径名的绝对路径名字符串。
String getParent():返回此抽象路径名父目录的抽象路径名,如果此路径名没有指定父目录,则返回 null。
long lastModified():返回此抽象路径名表示的文件最后一次被修改的时间。
File.pathSeparator:返回当前系统默认的路径分隔符,windows默认为 “;”。
File.Separator:返回当前系统默认的目录分隔符,windows默认为 “\”。判断
—boolean exists():判断File对象所对应的文件或目录是否存在。
—boolean isDirectory():判断File对象所对应的是否是目录,而不是文件。
—boolean isFile():判断File对象所对应的是否是文件,而不是目录。
—boolean isAbsolute():判断File对象所对应的文件或目录是否是绝对路径。该方法消除了不同平台的差异。可以直接判断File对象是否为绝对路径。
在UNIX/Linux/BSD等系统上,如果路径名开头是一条斜线(/),则表明该File对象对应一个绝对路径;在Windows等系统上,如果路径开头是盘符,则说明他是一个绝对路径。renameTo()
renameTo():可以完成修改文件名和移动文件的功能
(后面有详细讲解)
File类常用方法的代码实现
public static void isDemo() {
File f=new File("a.txt");
boolean b=f.exists();
System.out.println("b="+b);
boolean b1=f.isFile();
System.out.println("b1="+b1);
boolean b2=f.isDirectory();
System.out.println("b2="+b2);
}
public static void creatAndDelete() throws IOException {
File dirs=new File("abcd\\f\\d\\hh\\w\\t\\s");
boolean c=dirs.mkdirs();
System.out.println(c);
//删除成功是因为从里向外删除只删除了最里层的s文件夹
boolean c1=dirs.delete();
System.out.println(c1);
//如果创建的文件夹里面创建有子文件便不能删除文件夹
//因为Windows的删除是从里向外进行的
File dir=new File("abc");
boolean a=dir.mkdir();
System.out.println(a);
boolean a1=dir.delete();
System.out.println(a1);
//如果文件不存在。进行创建。如果文件存在,不进行覆盖
File file=new File("file.txt");
boolean b=file.createNewFile();
System.out.println(b);
boolean b1=file.delete();
System.out.println(b1);
}
private static void getDemo() {
File file =new File("a.txt");
String name=file.getName();
String abspath=file.getAbsolutePath();
String path=file.getPath();
long len=file.length();
long time=file.lastModified();
System.out.println("name:"+name);
System.out.println("abspath:"+abspath);
System.out.println("path:"+path);
System.out.println("len:"+len);
System.out.println("time:"+time);
//将最后衣蛾次创建时间转化成格式化时间
Date date=new Date(time);
DateFormat dateformat=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
String str_date=dateformat.format(date);
System.out.println("str_date:"+str_date);
}
File类的重点之list(),listFiles()
—String[] list():列出File对象的所有子文件和路径名,返回String数组。
—File[] listFiles():列出File对象的所有子文件和路径,返回File数组。
—static File[] listRoots():列出系统所有的根路径。这是一个静态方法,可以直接通过File类来调用。
public static void main(String[] args) {
//以当前路径来创建一个File对象
File file1=new File("c:\\");
//使用list()方法列出当前路径下的所有文件和路径
String[] fileList=file1.list();
for(String fileName:fileList){
System.out.println(fileName);
}
//以当前路径来创建一个File对象
File file2=new File("c:\\");
//使用listFiles()列出当前路径下的所有路径和文件
File[] names=file2.listFiles();
for(File fileName:names){
System.out.println(fileName);
}
//listRoots()静态方法列出所有的磁盘根路径
File[] roots=File.listRoots();
for(File root:roots){
System.out.println(root);
}
}
上面三个代码块中第一个和第二个几乎是一个意思,只不过表现形式不同。
实现FilenameFilter接口的文件过滤器
有时候我们并不需要将全部的list()列表里的文件列出来,只需要列我们需要的文件,比如.java文件或者.txt文件。怎么才能把它们筛选出来呢,这就用了到文件过滤器。
在File类的list()方法中可以接受一个FilenameFilter参数,通过该参数可以只列出符合条件的文件。这里的FilenameFilter接口和javax.swing.filechooser包下的FileFilter抽象类的功能非常相似,可以把FileFilter当成FilenameFilter的实现类。
FilenameFilter接口里包含了一个accept(File dir,String name)方法,该方法将依次对指定File的所有子目录或者文件进行迭代。
File的list()方法的过滤器实现的是FilenameFilter接口
而File的listFiles()方法的过滤器实现的是FileFilter接口
- 普通代码。
private static void demo2() {
File file=new File("c:\\");
File[] names=file.listFiles(new FilterByHidden());
for(File name:names)
{
System.out.println(name);
}
}
private static void demo1() {
File file=new File("c:\\");
String[] names=file.list(new FilterByJava());
for(String name:names)
{
System.out.println(name);
}
}
public class FilterByJava implements FilenameFilter{
public boolean accept(File dir,String name){
return name.endsWith(".java");
}
}
public class FilterByHidden implements FileFilter {
@Override
public boolean accept(File pathname) {
return !pathname.isHidden();
}
}
2.增强版代码
public static void demo3() {
File file=new File("c:\\");
String[] names=file.list(new SuffixFilter(".txt"));
for(String name:names)
{
System.out.println(name);
}
}
public class SuffixFilter implements FilenameFilter{
private String suffix;
public SuffixFilter(String suffix){
super();
this.suffix=suffix;
}
public boolean accept(File dir,String name){
return name.endsWith(suffix);
}
}
列出所有文件及其子文件的代码实现
public class Nothing {
public static void main(String[] args){
File dir=new File("D:\\MySQL");
listAll(dir,0);
}
private static void listAll(File dir,int level){
System.out.println(getSpace(level)+dir.getName());
level++;
File[] file=dir.listFiles();
for(int x=0;x<file.length;x++){
if(file[x].isDirectory()){
listAll(file[x],level);
}
else{
System.out.println(getSpace(level)+file[x].getName());
}
}
}
private static String getSpace(int level){
StringBuilder sb=new StringBuilder();
for(int x=0;x<level;x++){
sb.append(" ");
}
return sb.toString();
}
}
这里运用了递归知识点
renameTo()
public class Exercise {
public static void main(String args[]) {
// Old file
File oldFile = new File("/home/zjz/Desktop/myFile.txt");
// new file
File newFile = new File("/home/zjz/Desktop/myNewFile.txt");
/* renameTo() return boolean value
It return true if rename operation is successful
*/
boolean flag = oldFile.renameTo(newFile);
if (flag) {
System.out.println("File renamed successfully");
} else {
System.out.println("Rename operation failed");
}
}
}