黑马程序员技术交流社区

标题: 【石家庄校区】Java基础-File类 [打印本页]

作者: xiekai_sjz    时间: 2018-6-20 15:20
标题: 【石家庄校区】Java基础-File类
本帖最后由 xiekai_sjz 于 2018-6-20 15:24 编辑

    文件操作在java的IO操作中占有十分重要的地位,java为我们提供了File类用来进行文件操作。本文从以下几个方面来介绍java中对文件的操作。        (1)File类的概述
    (2)File对象创建
    (3)File类的常见方法
    (4)File类和递归结合使用来对文件进行操作

File类

一、概述
1、File类:文件和目录路径名的抽象表现形式
2、特点:
        1)用来将文件或文件夹封装成对象
        2)方便于对文件与文件夹的属性信息进行操作,因此是对流操作的一种补充
        3)File类的实例是不可变的;也就是说,一旦创建,File 对象表示的抽象路径名将永不改变
        4)File对象可以作为参数传递给流的构造函数

二、File对象创建
方式一:      
             File f =new File("a.txt");
        将a.txt封装成File对象。可以将已有的和未出现的文件或者文件夹封装成对象。
方式二:
            File f2=newFile("c:\\abc","b.txt");
        将文件所在目录路径和文件一起传入,指定文件路径。
方式三:
            File d=new File("c:\\abc");
             File f3=new File(d,"c.txt");
        将文件目录路径封装成对象。再创建文件对象。降低了文件于父目录的关联性。
三、File类的常见方法
[Java] 纯文本查看 复制代码
package com.itheima.test01;
import java.io.*;
   /*
   
   File 类常见方法
   1    创建   
            boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回 false.
                                       和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。
           boolean mkdir():创建文件夹。
           boolean mkdirs(): 创建多级文件夹。
  
  2    删除
          boolean delete():删除失败返回false。如果文件正在被使用,则删除不了 返回 false 、
          void deleteOnExit()  :  在程序退出时删除  指定文件。
  
  3    判断。
          boolean exists():文件是否存在
          isFile();  检查文件名是否为正常文件
          isDirectory():  是否是路径(目录)
          f.canExecute()    判断文件是否 可执行
          isHidden();        是否为隐藏文件
          isAbsolute():    是否有  绝对路径(目录)
  
  4    获取信息
          getName();//获取文件名
  
          getpath(): //获取文件的相对路径(即创建的对象传入的参数是什么就获取到什么)
  
          getParent();   //获取文件父目录。返回的是绝对路径中的父目录。如果获取的是相对路径,返回null。
                        //如果相对路径中有上一层目录,那么该目录就是返回结果。

          getAbsolutePath://获取文件的绝对路径  
  
          long lastModified()        //返回的是    最后一次修改时间
  
          long length//返回文件长度
  */
  class FileDemo
  {
      public static void main(String[] args)throws IOException
      {
          consMethod();
      }
      public static void method_5()
      {
          File f1=new File("file.txt");
  
          File f2=new File("c:\\haha.java");
  
          sop("rename:"+f1.renameTo(f2));
      }
      public static void method_4()
      {
          File f=new File("file4.txt");
          sop("path:"+f.getPath());//获取相对路径
          sop("abspath"+f.getAbsolutePath());//获取绝对路径
          sop("parent:"+f.getParent());//该方法返回的是绝对路径中的父目录。如果获取的是相对路径,返回null
                                      //如果相对路径中有上一层目录那么该目录就是返回结果
      }
      public static void method_3()throws IOException
      {
          File f =new File("d:\\javalianxi\\day20\\file2.txt");
          f.createNewFile();//创建文件
          f.mkdir();//创建一级目录
          //记住在判断文件对象是否是文件或者目的时,必须要先判断该文件对象封装的内容是否存在。
          //通过exists判断
          sop("dir:"+f.isDirectory());//返回是否是 文件夹
          sop("file:"+f.isFile());  //返回是否是文件
          sop("执行:"+f.canExecute());//返回是否可执行
          sop(f.isAbsolute());//返回是否是绝对路径
      }
      public static void method_2()
      {
          File f=new File("file.txt");
          sop("exists:"+f.exists());
          sop("execute:"+f.canExecute());
          //创建文件夹
          File dir=new File("abc\\kkk\\a\\a\\dd\\ee\\qq\\aaa");
          sop("mkdir:"+dir.mkdirs());//创建多级目录
      }
      public static void method_1()throws IOException
      {
          File f=new File("file.txt");
         
          //sop("create:"+f.createNewFile());
          //sop("delete:"+f.delete());
      }
  
      public static void sop(Object obj)
      {
          System.out.println(obj);
      }
      //创建File对象
      public static void consMethod()throws IOException
      {
          //将a.txt封装成file对象。可以将已有的和未出现的文件夹封装成对象。
          File f1=new File("a.txt");
          File f2=new File("c:\\abc","b.txt");
          File d=new File("c:\\abc");
          File f3=new File(d,"c.txt");
         new File("c:\\abc").mkdir();
         f2.createNewFile();//创建新文件
         
         sop("f1:"+f1);
         sop("f2:"+f2);
         
         File f4 = new File("c:"+File.separator+"abc"+File.separator+"zzz"+File.separator/*为跨平台目录符号*/+"a.txt");
         sop("f3:"+f4);
     }
}
5、列出文件及文件过滤
        static File[] listRoots();//列出可用的文件系统根目录,即系统盘符
        String[] list();
        //列出当前目录下所有文件,包括隐藏。调用list方法的file对象必须是封装了一个目录。该目录还必须存在。
        String[]list(FilenameFilter filter);
        //返回一个字符串数组,获取目录中满足指定过滤器的文件或目录。
        //FilenameFilter:文件名过滤器,是一个接口,其中包含一个方法,accept(Filedir,String name),返回的是boolean型,对不符合条件的文件过滤掉。
        File[] listFiles();//返回一个抽象路径名数组,获取当前文件夹下的所有文件和文件夹
        File[] ListFiles(FilenameFilterfilter);//返回抽象路径名数组,获取目录中满足指定过滤器的文件或目录。
[Java] 纯文本查看 复制代码
import java.io.*;
class FileDemo2
{
    public static void main(String[] args)
    {
    listRootsDemo();
    }
    public static void listDemo_1()//建立文件dir关联C盘  之后将C盘文件遍历获取名字和长度
    {
        File dir=new File("c:\\");
        File[] files=dir.listFiles();//返回一个抽象路径名数组,获取当前文件夹下的所有文件和文件夹
        for(File f:  files)
        {
            System.out.println(f.getName()+"::"+f.length());
        }
    }
    public static void listDemo_2()//获取一个目录下所有的.java文件方法  
    {
        File dir = new File("d:\\javalianxi\\day19");
        String[] arr=dir.list(new FilenameFilter()//建立匿名内部类,取出末尾为。java的文件
        {
            public boolean accept(File dir,String name)      
            {
                //System.out.println("dir:"+dir+".....name::"+name);
                /*
                if(name.endsWith(".java"))
                return true;
                else
                return false;*/
                return  name.endsWith(".java");//判断文件名是否是以.java结尾
               
            }

        });
        System.out.println("len:"+arr.length);
        for(String name:arr)  //遍历数组
        {
            System.out.println(name);
        }
    }
    public static void listDemo()
    {
        File f=new File("c:\\abc.txt");
        String[]names =f.list();//调用list方法的file对象必须是封装了一个目录。该目录还必须存在
        for(String name : names)
        {
            System.out.println(name);
        }
    }
    public static void listRootsDemo()
    {
        File[]files =File.listRoots();//列出可用的文件系统根目录,即系统盘符
        for(File f:files)
        {
            System.out.println(f);
        }
    }
}
四、递归
1.递归打印文件名
[Java] 纯文本查看 复制代码
import java.io.*;
/*
列出指定目录下文件或者文件夹,包括子目录中的内容
也就是列出指定目录下所有内容。

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

递归要注意:
1    限定条件
2    要注意递归的次数,尽量避免内存溢出。因为每次调用自身的时候都会先执行下一次调用自己的方法,
    所以会不断在栈内存中开辟新空间,次数过多,会导致内存溢出。


*/
class FileDemo3
{
    public static void main(String[] args)
    {
        File dir=new File("d:\\javalianxi\\day18");//关联指定路径
        list(dir,0);
    }
    public static String getLevel(int level)//获取目录为几级目录,目录名前添加"   ",显示出层次感
    {
        StringBuilder sb=new StringBuilder();//建立字符串缓冲区,用来存储空格
        while(level>0){
        sb.append("   ");
        level--;}
        return sb.toString();//返回大量空格
    }
    public static void list(File dir,int level)
    {
        level++;//定义目录等级,多调用一次,目录等级加1
        File files[]=dir.listFiles();////获取本目录下的所以文件和目录的抽象路径
        for(int x=0;x<files.length;x++)
        {
            if(files[x].isDirectory())//判断是否是目录
                list(files[x],level);//是目录,则继续遍历文件
            else
                System.out.println(getLevel(level)+files[x]);//打印出文件名
        }
    }
}
2.递归删除一个带内容的目录
[Java] 纯文本查看 复制代码
/*
删除一个带内容的目录
删除原理
在windows中,删除目录从里面往外删除的

既然是从里往外删除。就需要用到递归
*/
import java.io.*;
class RemoveDir
{
    public static void main(String[] args)
    {
        File dir=new File("D:\\javalianxi\\day20\\abc - 副本");//关联目录
        removedir(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());//打印文件名,并删除文件,删除成功返回true
        }
        System.out.println(dir+"::dir::"+dir.delete());//删除目录
    }
}
3.将一个指定目录下的java文件的绝对路径,存储到一个文本文件中
[Java] 纯文本查看 复制代码
/*
练习
将一个指定目录下的java文件的绝对路径,存储到一个文本文件中。
建立一个java文件列表文件。

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

*/
import java.io.*;
import java.util.*;
class  JavaFileList
{
    public static void main(String[] args) throws IOException
    {
        File dir=new File("d:\\javalianxi\\day19");//关联指定目录
        List <File>list=new ArrayList<File>();//定义一个List集合,用于存储.java文件的File对象
        fileToList(dir,list);//调用获取文件路径方法
        File file=new File(dir,"javapath.txt");//指定写入文件
        writeToFile(list,file.toString()); //调用写入文件方法,将集合和文件名传入
        
    }
    public static void fileToList(File dir,List<File> list)//获取指定文件夹内的所有java文件的绝对路径,并存入集合中  
    {
        File files[]=dir.listFiles();//列出dir路径下的所以文件和目录
        for(File file:files)  //遍历
        {
            if(file.isDirectory())//如果是目录,则继续调用本函数
                fileToList(file,list);
            else
            {
                if(file.getName().endsWith(".java"))//判断是否是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
        {
            try
            {
                if(bufw!=null)
                    bufw.close();
            }
            catch (IOException e)
            {
                throw e;
            }
        }
    }
}
4.键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中,每种类型的文件及个数
[Java] 纯文本查看 复制代码
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

/*
* 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中,每种类型的文件及个数,
*/

public class Test03 {
        public static void main(String[] args) {
               
                Map<String,Integer> map = new HashMap<>();
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入要查询的路径");
                String fileName = sc.nextLine();
                File f = new File(fileName);
                count(f,map);
               
                Set<String> keys = map.keySet();
                //遍历所有的丈夫
                for (String key : keys) {
                        //让每个丈夫去找他自己的媳妇就可以了
                        int value = map.get(key);
                        System.out.println( key + "---"  + value);
                }
               
        }
       
        public static void count(File file ,Map<String,Integer> map){
                if(file.isDirectory()){
                        File[] files = file.listFiles();
                        for (File file2 : files) {
                                if(file2.isFile()){
                                        String name = file2.getName().substring(file2.getName().lastIndexOf(".")+1);
                                        if(map.containsKey(name)){
                                                int num = map.get(name)+1;
                                                map.put(name, num);
                                        }else{
                                                map.put(name, 1);
                                        }
                                }else{
                                        count(file2,map);
                                }
                        }
                }
        }

}












欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2