你的位置:首页 > Java教程

[Java教程]IO流04


Day20

01 File概述
02 File对象功能-创建和删除
03 File对象功能-判断
04 File对象功能-获取
05 File对象功能-文件列表1
06 File对象功能-文件列表2
07 列出目录下所有内容-递归
08 列出目录下所有内容-带层次
09 删除带内容的目录

 

01 File概述

File类
用来将文件或者文件夹封装成对象
方便对文件与文件夹进行操作
File对象可以作为参数传递给流的构造函数
了解File类中的常用方法。

 

public static final String separator:与系统有关的默认名称分隔符,它被表示为一个字符串。
 1 import java.io.*; 2 public class FileDemo 3 { 4   public static void main(String[] args)  5   { 6     consMethod(); 7      8   } 9   //创建File对象10   public static void consMethod()11   {12     //将q.txt封装成File对象。可以将已有的和未出现的文件或者文件夹封装成对象。13     File f1=new File("q.txt");14 15     File f2=new File("d:\\abc","w.txt");16 17     File d=new File("d:\\abc");18     File f3=new File(d,"e.txt");19 20     sop("f1:"+f1);21     sop("f2:"+f2);22     sop("f3:"+f3);23     24     //File.separator是跨平台的。25     File f4=new File("d:"+File.separator+"abc"+File.separator+"r.txt");26 27   }28   public static void sop(Object obj)29   {30     System.out.println(obj);31   }32 }

View Code

 

02 File对象功能-创建和删除

boolean createNewFile():当且仅当不存在此指定名称的文件时,创建一个新的空文件。
boolean delete():删除此抽象路径名表示的文件或目录。
void deleteOnExit():在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。

 1 /* 2 File类常见方法: 3 1.创建 4 boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false 5             和输出流不一样,输出流对象建立文件,如果文件已经存在,则会覆盖。 6 2.删除 7 boolean delete():删除失败返回false 8 void deleteOnExit:在程序退出时删除指定文件。 9 */10 import java.io.*;11 public class FileDemo212 {13   public static void main(String[] args) throws IOException14   {15     method();16     17     18   }19   20   public static void method()throws IOException21   {22     File f=new File("file.txt");23     sop("create:"+f.createNewFile());24 25   26   }27   public static void sop(Object obj)28   {29     System.out.println(obj);30     31   }32 }

View Code

 

03 File对象功能-判断

创建文件夹:
boolean mkdir():创建一级文件夹
boolean mkdirs():创建多级文件夹
判断:
boolean exists():文件是否存在。
boolean canExecute():测试文件是否可执行
isFile():是否是文件。
isDirectory():是否是目录
isHidden():测试此抽象路径名指定的文件是否是一个隐藏文件。
isAbsolute():测试此抽象路径名是否为绝对路径名。


04 File对象功能-获取

getName():返回文件或者目录的名称。
getPath():将此抽象路径名转换为一个路径字符串。
getParent():返回父目录的路径字符串;如果此路径名没有指定父目录,则返回null。

getAbsolutePath():返回绝对路径。
long lastModified():返回文件最后一次被修改的时间,
long length():返回文件的长度。

public boolean renameTo(File dest):重命名此抽象路径表示的文件

 1 /* 2 获取信息: 3 getName(); 4 getPath(); 5 getParent(); 6  7 getAbsolutePath(); 8 long lastModofied(); 9 long length();10 11 removeTo():12 13 */14 import java.io.*;15 public class FileDemo216 {17   public static void main(String[] args) throws IOException18   {19     method_5();20     21     22   }23   public static void method_5()24   {25     File f1=new File("d:\\abc\\a.txt");26     File f2=new File("e:\\hahaha.txt");27     sop("rename:"+f1.renameTo(f2));28 29     30   }31 32   public static void method_4()33   {34     File f=new File("file.txt");35 36     sop("path:"+f.getPath());37     sop("abspath:"+f.getAbsolutePath());38     //该方法返回的是绝对路径中的父目录39     //如果获取的是相对路径,返回null40     //如果相对路径中有上一层目录,那么该目录就是返回结果41     sop("parent:"+f.getParent());42     43   }44   public static void method()throws IOException45   {46     File f=new File("file.txt");47     sop("create:"+f.createNewFile());48 49   50   }51   public static void sop(Object obj)52   {53     System.out.println(obj);54     55   }56 }

View Code

 

05 File对象功能-文件列表1

 

static File[] listRoots():列出可用的文件系统根。
String[] list():返回一个字符串数组,这些字符串指定路径名表示的目录中的文件和目录。

 

 1 import java.io.*; 2 public class FileDemo3 3 { 4   public static void main(String[] args)  5   { 6      7     listRootDemo(); 8     listDemo(); 9   }10   //列出指定路径下所有的文件11   public static void listDemo()12   {13     File f=new File("d:\\");14     //当调用list的对象是一个文件时,会发生空指针异常,因为返回的数组为空15     String[] string=f.list();16     for(String s:string)17     {18       System.out.println(s);19     }20   }21   //列出计算机中中所有可用的盘符22   public static void listRootDemo()23   {24     File[] files =File.listRoots();25     for(File f:files)26     {27       System.out.println(f);28     }29   }30 }

View Code

 

06 File对象功能-文件列表2

String list(FilenameFilter filter):返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。

其中,FilenameFilter是一个接口,里面只有一个抽象方法accept

 1 import java.io.*; 2 public class FileDemo3 3 { 4   public static void main(String[] args)  5   { 6     listDemo_2(); 7     listDemo_3(); 8      9     10   }11   public static void listDemo_3()12   {13     //list()和listFiles()的区别14     //list()返回的是字符串数组15     //listFiles()返回的是File数组16     File dir=new File("c:\\");17     File[] files=dir.listFiles();18     for(File f:files)19     {20       System.out.println(f.getName()+"::"+f.length());21     }22   }23   //带参数的list方法,返回满足指定过滤器的文件和目录24   public static void listDemo_2()25   {26     File dir=new File("d:\\abc");27     //使用匿名内部类来实现FilenameFilter接口的抽象方法28     String[] arr=dir.list(new FilenameFilter()29     {30       public boolean accept(File dir,String name)31       {32         return name.endsWith(".bmp");33       }34     });35     for(String name:arr)36     {37       System.out.println(name);38     }39 40   }41 }

View Code

 


07 列出目录下所有内容-递归

 

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

 

因为目录中还有目录,只要使用同一个列出目录功能的方法完成即可。
在列出的过程中出现的还是目录的话,就再次调用本方法。
这种编程手法,叫做递归。

 

 1 /* 2  3 递归要注意: 4 1.递归条件 5 2.递归次数:避免内存溢出 6 */ 7 import java.io.*; 8 public class FileDemo_4 9 {10   public static void main(String[] args) 11   {12     File dir=new File("d:\\");13     //showDir(dir);14     //求6的二进制15     toBin(6);16     //求1到100的和17     System.out.println("求1到100的和为:"+getSum(100));18 19   }20   //递归小例子,十进制变二进制21   public static void toBin(int num)22   {23     if(num>0)24     {25       toBin(num/2);26       System.out.println(num%2);27     }28   29   }30   //递归小例子2,求和31   //注意,递归次数过多,可能造成内存溢出32   public static int getSum(int n)33   {34     if(n==1)35       return 1;36     return n+getSum(n-1);37   }38   //显示目录39   public static void showDir(File dir)40   {41     System.out.println(dir);42     File[] files =dir.listFiles();43     for(int x=0;x<files.length;x++)44     {45       if(files[x].isDirectory())46         showDir(files[x]);47       else48       System.out.println(files[x]);49     }50   }51 }

View Code

 

08 列出目录下所有内容-带层次

上一小节中中递归显示的目录有点乱,怎么打印出有层次的目录呢?

 

 1 //显示出带有层次的目录 2 import java.io.*; 3 public class FileDemo_5 4 { 5   public static void main(String[] args)  6   { 7     File f=new File("D:\\phpnow"); 8     showDir(f,0); 9     10   }11   public static String getLevel(int level)12   {13     StringBuilder sb=new StringBuilder();14     for(int x=0;x<level;x++)15     {16       sb.append(" ");17     }18     return sb.toString();19   }20   public static void showDir(File dir,int level)21   {22     System.out.println(getLevel(level)+dir.getName());23     level++;24     File[] files=dir.listFiles();25     for(int x=0;x<files.length;x++)26     {27       if(files[x].isDirectory())28         showDir(files[x],level);29       else30         System.out.println(getLevel(level)+files[x].getName());31     }32   }33 }

View Code

 

09 删除带内容的目录

 删除一个带内容的目录

删除原理:
在Windows中,删除目录是从里往外删除的。
既然是从里往外删除,就需要用到递归。

 1 import java.io.*; 2 public class RemoveDir 3 { 4   public static void main(String[] args)  5   { 6     File f=new File("D:\\课堂练习"); 7     removeDir(f); 8      9   }10   public static void removeDir(File dir)11   {12     File[] files=dir.listFiles();13     for(int x=0;x<files.length;x++)14     {15       if((!files[x].isHidden() )&& files[x].isDirectory())16       {removeDir(files[x]);}17       else18       {System.out.println(files[x].toString()+"--"+files[x].delete());}19 20     }21     System.out.println(dir+"::"+dir.delete());22   }23 }

View Code