37.File

File类
用来将文件或者文件夹封装成对象
方便对文件与文件夹的属性信息进行操作

public class File_01 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        consMethod();
    }
    
    //创建File对象
    public static void consMethod(){
        
        //将a.txt封装成file对象。可以将已有的和未出现的文件或文件夹封装成对象
        File f1=new File("d:\\a.txt");
        
        
        //父目录+子文件
        File f2=new File("d:\\abc","b.txt");
        
        //文件夹+子文件
        File d=new File("d:\\cons");
        File f3=new File(d,"c.txt");
        
        sop("f1:"+f1);
        sop("f2:"+f2);
        sop("f3:"+f3);
    }

    public static void sop(Object o){
        System.out.println(o);
    }
}

 

File类常见方法:
  1.创建
    boolean createNewFile(); 在指定位置创建文件,如果该文件已经存在,则不创建,返回false
    和输出流不一样,输出流对象一建立就创建文件,文件已存在,会覆盖
    boolean mkdir():创建文件夹
    boolean mkdirs():创建多级文件夹
  2.删除
    boolean delete(); 删除失败返回false
    void deleteOnExit(); 在程序退出时删除指定文件
  3.判断
    boolean exists():文件是否存在
    isDirectory();
    isFile();
  4.获取信息
    getName()
    getPath():相对路径
    getParent()

    getAbsolutePath():绝对路径
    lastModified()
    length()

public class File_02 {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        //method_1();
        
        //method_2();
        
        //method_3();
        
        method_4();
        
        //method_5();
    }

    //创建、删除文件
    public static void method_1() throws IOException{
        
        File f=new File("d:\\file.txt"); //只是根据指定path生成了一个文件流而已
        
        sop("create:"+f.createNewFile());
        sop("delete:"+f.delete());
    }
    
    //创建文件夹
    public static void method_2(){
        
        File f=new File("d:\\file.txt");
        
        //sop("excute:"+f.canExecute());
        //sop("exists:"+f.exists());
        
        //创建文件夹
        File dir=new File("d:\\abc\\e\\f\\g\\h\\i\\j");
        File dir1=new File("d:\\abc\\e\\f\\g\\h");
        
        //sop("mkdir:"+dir.mkdir()); //只能创建一级目录
        sop("mkdirs:"+dir1.mkdirs());//可创建多级目录
        
    }
    
    //判断文件、文件夹
    public static void method_3(){
        
        File f=new File("d:\\newfile.txt");
        
        f.mkdir(); //带后缀的不一定就是文件,也可以是文件夹
        
        //记住在判断文件对象是否是文件或者目录时,必须要先判断该文件对象封装的内容是否存在。通过exists()判断
        sop("directory:"+f.isDirectory());
        sop("file:"+f.isFile());
    }
    
    //获取信息
    public static void method_4(){
        File f=new File("buf.txt");
        
        sop("path:"+f.getPath());
        sop("absolutePath:"+f.getAbsolutePath());
        sop("parent:"+f.getParent()); //该方法返回的是绝对路径中的文件父目录。如果获取的相对路径,返回null。如果相对路径中有上一层目录,那么该目录就是返回结果。
        sop("length:"+f.length());
    }
    
    //重命名
    public static void method_5(){
        
        File f1=new File("d:\\buf.txt");
        File f2=new File("d:\\haha.java");
        
        sop("rename:"+f1.renameTo(f2));
    }
    
    public static void sop(Object o){
        System.out.println(o);
    }
}

 

文件列表

public class File_03 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        //listRootsDemo();
        
        listDemo_1();
        
        System.out.println("-------------------");
           //listDemo_2();
        
        listDemo_3();
    }
    
    //文件 目录
    public static void listDemo_1(){
        
        File f=new File("d:\\aaa");
        
        String [] names=f.list(); //当前目录文件、文件夹名称。调用list方法的file对象必须是封装了一个目录。该目录还必须存在
        for(String name:names){
            System.out.println(name);
        }
    }
    
    public static void listDemo_2(){
        
        File dir=new File("d:\\aaa");
        
        String [] arr=dir.list(new FilenameFilter(){
            public boolean accept(File dir,String name){
                
                /*System.out.println("dir"+dir);
                System.out.println("name"+name);
                if(name.endsWith(".java")){
                    return true;
                }
                return false;*/
                
                return name.endsWith(".java");
            }
        });
        
        System.out.println("len:"+arr.length);
        for(String name:arr){
            System.out.println(name);
        }
        
    }
    
    //list()返回文件的名字,listFiles()返回文件
    public static void listDemo_3(){
        
        File dir=new File("d:\\aaa");
        
        File [] files=dir.listFiles();
        
        for(File f:files){
            System.out.println(f.getName()+":"+f.length());
        }
    }
    
    //有效盘符
    public static void listRootsDemo(){
        
        File [] files=File.listRoots(); //有效盘符  C:\  D:\  E:\ 
        
        for(File f:files){
            System.out.println(f);
        }
    }

}

 

列出指定目录下文件或者文件夹,包含子目录中的内容。
即列出指定目录下所有内容

因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。
在列出目录过程中出现的还是目录的话,还可以再次调用本功能。也就是函数自身调用自身。
这种表现形式,或者编程手法,称为递归。

递归要注意:
1.限定条件
2.要注意递归的次数,尽量避免内存溢出。

public class File_DiGui_04 {

    public static void main(String args[]){
    
        File dir=new File("D:\\workspace");
        
        showDir(dir);
        
        //toBin(6);
        
        //System.out.println(getSum(10));
    }
    
    public static void showDir(File dir){
    
        System.out.println(dir);
        File [] files=dir.listFiles();
        for(int x=0;x<files.length;x++){
            if(files[x].isDirectory()){
                showDir(files[x]);
            }else{
                System.out.println(files[x]);
            }
        }
    }
    
    public static int getSum(int n){
        
        if(n==1){
            return 1;
        }else{
            return n+getSum(n-1);
        }
    }
    
    public static void toBin(int num){
        
        while(num>0){
            toBin(num/2);
            System.out.println(num%2);
            //num=num/2; 
            
        }
    }
}

 

删除一个带内容的目录
删除原理:
在window中,删除目录是从里面往外删除的。

既然是从里往外 删除,就需要用到递归

public class File_05 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        File dir=new File("d:\\abc");
        
        removeDir(dir);
        //remove(dir);
    }

    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());
    }
    
    //为删除文件夹内文件,无法删除。此目录必须为空才能删除
    public static void remove(File dir){
        File [] files=dir.listFiles();
        
        System.out.println(dir.delete());
    }
}

 

练习:
将一个指定目录下的Java文件的绝对路径,存储到一个文本文件中。
建立一个java文件列表清单

思路:
1.对指定的目录进行递归
2.获取递归过程中所有java文件的路径
3.将这些路径存储到集合中
4.将集合中的数据写入到一个文件中

 

public class File_06 {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        
        //将目录存入List
        File dir=new File("d:\\abc");
        List<File> list=new ArrayList<File>();
        fileToList(dir,list);
        
        File file=new File(dir,"javalist.txt");
        
        writeToFile(list,file.toString());//返回此抽象路径名的路径名字符串
    }
    
    public static void fileToList(File dir,List<File> list){
        
        File [] files=dir.listFiles();

        for(File file:files){
            if(file.isDirectory()){
                fileToList(file,list);
            }else{
                if(file.getName().endsWith(".java")){
                    list.add(file);
                }
            }
        }
    }
    
    public static void writeToFile(List<File> list,String javaListFile) throws IOException{
        
        BufferedWriter bufw=null;
        
        try {
            bufw=new BufferedWriter(new FileWriter(javaListFile));
            
            for(File f:list){
                String path=f.getAbsolutePath();
                bufw.write(path);
                bufw.newLine();
                bufw.flush();
            }
        } catch (IOException e) {
            throw e;
        }finally{
            if(bufw!=null){
                bufw.close();
            }
        }
    }

}

 

posted @ 2018-02-01 00:50  一日看尽长安花cxjj  阅读(200)  评论(0)    收藏  举报