天天看点

黑马程序员——黑马学习日志之十五 IO流(四)

------- android培训、java培训、期待与您交流! ----------

黑马学习日志之十五 IO流(四)

1 File类

File类概述:用来将文件或者文件夹封装成对象,方便对文件与文件夹属性信息进行操作   File对象可以作为参数传递给流的构造函数。

流只能操作数据  而数据封装成文件 流不能操作文件的属性信息 File类是对流的补充

例子:

import java.io.*;

class FileDemo

{

  public static void main(String [] args){

consMethod();

 }

 public static void consMethod(){

    //创建File对象

//将a.txt封装成file对象。可以将已有的和未出现的文件或者文件夹 //封装成对象

    File f = new File("a.txt");

//这里将目录和文件分开传递 文件可以传递变量

    File f2 = new File("d:\\abc","b.txt");

//和上面的是一样的,但是上面能分开传递 

    File f2 = new File("d:\\abc\\b.txt");

    File d = new File("d:\\abd");

   File f3 = new File(d,"c.txt");

   sop("f1:"+f1);//打印的是路径

   sop("f2:"+f2);

   sop("f3:"+f3);//封装绝对路径打印绝对 封装相对路径打印相对路径

  File f4 = new File("d:\\abc\\zzz\\a.txt");//不同系统反斜杠是不一样的

  //在任意系统下都可以的separator实现跨平台

  File f4 = new File("d:"+File.separator+"abc"+Fileseparator+".zzz"+

File.separator+"a.txt");

 }

  public static void sop(Object obj){

   System.out.println(obj);

 }

}

2 File类常见方法

创建

 public boolean createNewFile()throws IOException 硬盘上创建文件,在指定位置创建文件,    如果该文件已经存在,则不创建,返回false

static File createTempFile(String prefix, String suffix) 创建临时文件(前缀名,后缀名)

static File createTempFile(String prefix, String suffix, File directory) 指定目录下创建临时文件

mkdir();创建一级目录

mkdirs();创建多级目录

 删除

 boolean delete()  删除失败返回false  

 void deleteOnExit()  在程序退出时删除指定文件

判断

  boolean canExecute()  判断文件是否可以执行

  int compareTo(File pathname) 按文件名字比较 还可以自己定义比较器

  boolean exists()  文件是否存在 

  boolean isDirectory()  是否是文件目录 文件夹

  boolean isFile()   是否是文件

  boolean isHidden()  是否是隐藏

  boolean isAbsolute() 是否是绝对路径名

获取信息

 String getName(); 获取文件名

 getPath();  获取相对路径

 String getParent()  获取父级路径 最后一个斜线之前的内容

 File getParentFile()  返回父类文件

 String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串 //String new一下变成File

 File getAbsoluteFile() 将返回的绝对路径的字符串封装成文件

 long lastModified()  获取最后修改时间

 long length() 返回由此抽象路径名表示的文件的长度 

 boolean renameTo(File dest)  重新命名 

3 文件列表

static File[] listRoots()  列出可用的系统根目录,静态方法 操作共享数据

import java.io.*;

class FileDemo2

{

 public static void main(String [] args){

   listDemo();

 }

 public static void listDemo(){

  File f = new File("c:\\abc.txt");

  String [] names = f.list();//打印指定目录下的所有文件包含隐藏文件 

   //调用list方法的file对象必须封装了一个目录。该目录还必须存在

   //若该目录是空的 可以运行 但返回的数组的长度是0 

  for (String name : names )

  {

   System.out.println(name);

  }

 }

 public static void listRootsDemo(){

  File [] files = File.listRoots();//列出机器中有效的盘符 是个静态方法

  for(File f :files){

   System.out.println(f);

     }

 }

}

 FilenameFilter文件名过滤器 是个接口 

 boolean accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中 

4 递归 列出目录下的所有内容

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

因为目录中还有目录,只有使用同一个列出目录功能的函数即可。

在列出过程中出现的还是目录的话,还可以再次调用本功能,也就是函数自身调用自身,这种编程手法叫做递归。

注意:

 1.限定条件

 public static void method(){

  method();//这个函数递归停不下来

 }

 2.要注意递归的次数。尽量避免内存的溢出

例子:

import java.io.*;

class FileDemo3one

{

 public static void main(String [] args ){

  File dir = new File("D:\\TDownLoad");

  showDir(dir,0);

 }

 public static String getLevel(int level){

  StringBuilder sb = new StringBuilder();

  sb.append("|--");

  for (int x= 0;x<level ;x++ )

  {

   //sb.append("|--");

   sb.insert(0,"|  ");

  }

  return sb.toString();

 }

 public static void showDir(File dir,int level){

  System.out.println(getLevel(level)+dir.getName());

  level++;

  File [] files = dir.listFiles();

  for (int x= 0 ; x<files.length;x++ )

  {

   if(files[x].isDirectory())

    showDir(files[x],level);

   else//此处一定要用else语句  

       System.out.println(getLevel(level)+files[x]);

  }

 }

}

5 删除带内容的目录

删除原理:在windows中,删除目录从里面往外删除的。如果文件夹时空的 直接delete   既然是从里往外删除。就需要用到递归。

注意:如果建立的文件过多,递归删除的话,栈内存占有会太多 所以一直删除不了。

      c盘中有一些目录是隐藏而且无法访问,会报空指针异常。系统中有的看上去是文件,其实是目录,没有扩展名,或者有的看是目录,却是文件

      java的删除功能是不走回收站的

      判断文件时,可以先判断是否隐藏,再判断是否是目录 

例子:

import java.io.*;

class RemoveDir

{

 public static void main(String [] args){

  File dir = new File("D:\\abc");

  removeDir(dir);

 }

 public static void removeDir(File dir){

  //判断dir 是否存在 exists()

  File [] files = dir.listFiles();

  for (int x= 0; x<files.length;x++ )

  {

   if(!files[x].isHidden() && files[x].isDirectory())

     removeDir(files[x]);

   else

     System.out.println(files[x]+":===:"+files[x].delete());

  }

  System.out.println(dir+"::dir:::"+dir.delete());

 }

}

6 创建文件列表

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

思路:

1.对指定的目录进行递归 目录中还有目录

2.获取递归过程中的所有java文件的路径

3.将这些路径存储到集合中,直接写是可以的 但是只是一次打印在控制台上

4.将集合中的数据写入到一个文件中

用流的方法来操作,将数据写在集合中,直接传入file对象

import java.io.*;

import java.util.*;

class JavaFileList2

{

 public static void main(String [] args)throws Exception{

  File dir = new File("F:\\ceshi");

  List<File> list = new ArrayList<File>();

  fileToList(dir , list);

  System.out.println(list.size());

  File file = new File(dir,"\\javalist.txt");

  writeToFile(list,file);

 }

 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,File file)throws Exception{

  BufferedWriter bufw = null ;

  try

  {

   bufw =new BufferedWriter(new FileWriter(file));

   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;

   }

  }

 }

}

------- android培训、java培训、期待与您交流! ----------