天天看點

黑馬程式員——黑馬學習日志之十五 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教育訓練、期待與您交流! ----------