程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java編程那些事兒86——文件操作之File類使用

Java編程那些事兒86——文件操作之File類使用

編輯:關於JAVA

11.3 I/O類使用

由於在IO操作中,需要使用的數據源有很多,作為一個IO技術的初學者,從讀寫文件開始學習IO技術是一個比較好的選擇。因為文件是一種常見的數據源,而且讀寫文件也是程序員進行IO編程的一個基本能力。本章IO類的使用就從讀寫文件開始。

11.3.1 文件操作

文件(File)是最常見的數據源之一,在程序中經常需要將數據存儲到文件中,例如圖片文件、聲音文件等數據文件,也經常需要根據需要從指定的文件中進行數據的讀取。當然,在實際使用時,文件都包含一個的格式,這個格式需要程序員根據需要進行設計,讀取已有的文件時也需要熟悉對應的文件格式,才能把數據從文件中正確的讀取出來。

文件的存儲介質有很多,例如硬盤、光盤和U盤等,由於IO類設計時,從數據源轉換為流對象的操作由API實現了,所以存儲介質的不同對於程序員來說是透明的,和實際編寫代碼無關。

11.3.1.1 文件的概念

文件是計算機中一種基本的數據存儲形式,在實際存儲數據時,如果對於數據的讀寫速度要求不是很高,存儲的數據量不是很大時,使用文件作為一種持久數據存儲的方式是比較好的選擇。

存儲在文件內部的數據和內存中的數據不同,存儲在文件中的數據是一種“持久存儲”,也就是當程序退出或計算機關機以後,數據還是存在的,而內存內部的數據在程序退出或計算機關機以後,數據就丟失了。

在不同的存儲介質中,文件中的數據都是以一定的順序依次存儲起來,在實際讀取時由硬件以及操作系統完成對於數據的控制,保證程序讀取到的數據和存儲的順序保持一致。

每個文件以一個文件路徑和文件名稱進行表示,在需要訪問該文件的時,只需要知道該文件的路徑以及文件的全名即可。在不同的操作系統環境下,文件路徑的表示形式是不一樣的,例如在Windows操作系統中一般的表示形式為C:\windows\system,而Unix上的表示形式為/user/my。所以如果需要讓Java程序能夠在不同的操作系統下運行,書寫文件路徑時還需要比較注意。

11.3.1.1.1 絕對路徑和相對路徑

絕對路徑是指書寫文件的完整路徑,例如d:\java\Hello.java,該路徑中包含文件的完整路徑d:\java以及文件的全名Hello.java。使用該路徑可以唯一的找到一個文件,不會產生歧義。但是使用絕對路徑在表示文件時,受到的限制很大,且不能在不同的操作系統下運行,因為不同操作系統下絕對路徑的表達形式存在不同。

相對路徑是指書寫文件的部分路徑,例如\test\Hello.java,該路徑中只包含文件的部分路徑\test和文件的全名Hello.java,部分路徑是指當前路徑下的子路徑,例如當前程序在d:\abc下運行,則該文件的完整路徑就是d:\abc\test。使用這種形式,可以更加通用的代表文件的位置,使得文件路徑產生一定的靈活性。

在Eclipse項目中運行程序時,當前路徑是項目的根目錄,例如工作空間存儲在d:\javaproject,當前項目名稱是Test,則當前路徑是:d:\javaproject\Test。在控制台下面運行程序時,當前路徑是class文件所在的目錄,如果class文件包含包名,則以該class文件最頂層的包名作為當前路徑。

另外在Java語言的代碼內部書寫文件路徑時,需要注意大小寫,大小寫需要保持一致,路徑中的文件夾名稱區分大小寫。由於’\’是Java語言中的特殊字符,所以在代碼內部書寫文件路徑時,例如代表“c:\test\java\Hello.java”時,需要書寫成“c:\\test\\java\\Hello.java”或“c:/test/java/Hello.java”,這些都需要在代碼中注意。

11.3.1.1.2 文件名稱

文件名稱一般采用“文件名.後綴名”的形式進行命名,其中“文件名”用來表示文件的作用,而使用後綴名來表示文件的類型,這是當前操作系統中常見的一種形式,例如“readme.txt”文件,其中readme代表該文件時說明文件,而txt後綴名代表文件時文本文件類型,在操作系統中,還會自動將特定格式的後綴名和對應的程序關聯,在雙擊該文件時使用特定的程序打開。

其實在文件名稱只是一個標示,和實際存儲的文件內容沒有必然的聯系,只是使用這種方式方便文件的使用。在程序中需要存儲數據時,如果自己設計了特定的文件格式,則可以自定義文件的後綴名,來標示自己的文件類型。

和文件路徑一樣,在Java代碼內部書寫文件名稱時也區分大小寫,文件名稱的大小寫必須和操作系統中的大小寫保持一致。

另外,在書寫文件名稱時不要忘記書寫文件的後綴名。

11.3.1.2 File類

為了很方便的代表文件的概念,以及存儲一些對於文件的基本操作,在java.io包中設計了一個專門的類——File類。

在File類中包含了大部分和文件操作的功能方法,該類的對象可以代表一個具體的文件或文件夾,所以以前曾有人建議將該類的類名修改成FilePath,因為該類也可以代表一個文件夾,更准確的說是可以代表一個文件路徑。

下面介紹一下File類的基本使用。

1、File對象代表文件路徑

File類的對象可以代表一個具體的文件路徑,在實際代表時,可以使用絕對路徑也可以使用相對路徑。

下面是創建的文件對象示例。

public File(String pathname)

該示例中使用一個文件路徑表示一個File類的對象,例如:

File f1 = new File(“d:\\test\\1.txt”);

File f2 = new File(“1.txt”);

File f3 = new File(“e:\\abc”);

這裡的f1和f2對象分別代表一個文件,f1是絕對路徑,而f2是相對路徑,f3則代表一個文件夾,文件夾也是文件路徑的一種。

public File(String parent, String child)

也可以使用父路徑和子路徑結合,實現代表文件路徑,例如:

File f4 = new File(“d:\\test\\”,”1.txt”);

這樣代表的文件路徑是:d:\test\1.txt。

2、File類常用方法

File類中包含了很多獲得文件或文件夾屬性的方法,使用起來比較方便,下面將常見的方法介紹如下:

a、createNewFile方法

public boolean createNewFile() throws IOException

該方法的作用是創建指定的文件。該方法只能用於創建文件,不能用於創建文件夾,且文件路徑中包含的文件夾必須存在。

b、delect方法

public boolean delete()

該方法的作用是刪除當前文件或文件夾。如果刪除的是文件夾,則該文件夾必須為空。如果需要刪除一個非空的文件夾,則需要首先刪除該文件夾內部的每個文件和文件夾,然後在可以刪除,這個需要書寫一定的邏輯代碼實現。

c、exists方法

public boolean exists()

該方法的作用是判斷當前文件或文件夾是否存在。

d、getAbsolutePath方法

public String getAbsolutePath()

該方法的作用是獲得當前文件或文件夾的絕對路徑。例如c:\test\1.t則返回c:\test\1.t。

e、getName方法

public String getName()

該方法的作用是獲得當前文件或文件夾的名稱。例如c:\test\1.t,則返回1.t。

f、getParent方法

public String getParent()

該方法的作用是獲得當前路徑中的父路徑。例如c:\test\1.t則返回c:\test。

g、isDirectory方法

public boolean isDirectory()

該方法的作用是判斷當前File對象是否是目錄。

h、isFile方法

public boolean isFile()

該方法的作用是判斷當前File對象是否是文件。

i、length方法

public long length()

該方法的作用是返回文件存儲時占用的字節數。該數值獲得的是文件的實際大小,而不是文件在存儲時占用的空間數。

j、list方法

public String[] list()

該方法的作用是返回當前文件夾下所有的文件名和文件夾名稱。說明,該名稱不是絕對路徑。

k、listFiles方法

public File[] listFiles()

該方法的作用是返回當前文件夾下所有的文件對象。

l、mkdir方法

public boolean mkdir()

該方法的作用是創建當前文件文件夾,而不創建該路徑中的其它文件夾。假設d盤下只有一個test文件夾,則創建d:\test\abc文件夾則成功,如果創建d:\a\b文件夾則創建失敗,因為該路徑中d:\a文件夾不存在。如果創建成功則返回true,否則返回false。

m、mkdirs方法

public boolean mkdirs()

該方法的作用是創建文件夾,如果當前路徑中包含的父目錄不存在時,也會自動根據需要創建。

n、renameTo方法

public boolean renameTo(File dest)

該方法的作用是修改文件名。在修改文件名時不能改變文件路徑,如果該路徑下已有該文件,則會修改失敗。

o、setReadOnly方法

public boolean setReadOnly()

該方法的作用是設置當前文件或文件夾為只讀。

3、File類基本示例

以上各方法實現的測試代碼如下:

import java.io.File;

/**

* File類使用示例

*/

public class FileDemo {

 public static void main(String[] args) {

  //創建File對象

  File f1 = new File("d:\\test");

  File f2 = new File("1.txt");

  File f3 = new File("e:\\file.txt");

  File f4 = new File("d:\\","1.txt");

  //創建文件

  try{

   boolean b = f3.createNewFile();

  }catch(Exception e){

   e.printStackTrace();

  }

  //判斷文件是否存在

  System.out.println(f4.exists());

  //獲得文件的絕對路徑

  System.out.println(f3.getAbsolutePath());

  //獲得文件名

  System.out.println(f3.getName());

  //獲得父路徑

  System.out.println(f3.getParent());

  //判斷是否是目錄

  System.out.println(f1.isDirectory());

  //判斷是否是文件

  System.out.println(f3.isFile());

  //獲得文件長度

  System.out.println(f3.length());

  //獲得當前文件夾下所有文件和文件夾名稱

  String[] s = f1.list();

  for(int i = 0;i < s.length;i++){

   System.out.println(s[i]);

  }

  //獲得文件對象

  File[] f5 = f1.listFiles();

  for(int i = 0;i < f5.length;i++){

   System.out.println(f5[i]);

  }

  //創建文件夾

  File f6 = new File("e:\\test\\abc");

  boolean b1 = f6.mkdir();

  System.out.println(b1);

  b1 = f6.mkdirs();

  System.out.println(b1);

  //修改文件名

  File f7 = new File("e:\\a.txt");

  boolean b2 = f3.renameTo(f7);

  System.out.println(b2);

  //設置文件為只讀

  f7.setReadOnly();

 }

}

4、File類綜合示例

下面以兩個示例演示File類的綜合使用。第一個示例是顯示某個文件夾下的所有文件和文件夾,原理是輸出當前名稱,然後判斷當前File對象是文件還是文件夾,如果則獲得該文件夾下的所有子文件和子文件夾,並遞歸調用該方法實現。第二個示例是刪除某個文件夾下的所有文件和文件夾,原理是判斷是否是文件,如果是文件則直接刪除,如果是文件夾,則獲得該文件夾下所有的子文件和子文件夾,然後遞歸調用該方法處理所有子文件和子文件夾,然後將空文件夾刪除。則測試時謹慎使用第二個方法,以免刪除自己有用的數據文件。示例代碼如下:

import java.io.File;

/**

* 文件綜合使用示例

*/

public class AdvanceFileDemo {

 public static void main(String[] args) {

  File f = new File("e:\\Book");

  printAllFile(f);

  File f1 = new File("e:\\test");

  deleteAll(f1);

 }


 /**

 * 打印f路徑下所有的文件和文件夾

 * @param f 文件對象

 */

 public static void printAllFile(File f){

  //打印當前文件名

  System.out.println(f.getName());

  //是否是文件夾

  if(f.isDirectory()){

   //獲得該文件夾下所有子文件和子文件夾

   File[] f1 = f.listFiles();

   //循環處理每個對象

   int len = f1.length;

   for(int i = 0;i < len;i++){

    //遞歸調用,處理每個文件對象

    printAllFile(f1[i]);

   }

  }

 }

 /**

 * 刪除對象f下的所有文件和文件夾

 * @param f 文件路徑

 */

 public static void deleteAll(File f){

  //文件

  if(f.isFile()){

   f.delete();

  }else{ //文件夾

   //獲得當前文件夾下的所有子文件和子文件夾

   File f1[] = f.listFiles();

   //循環處理每個對象

   int len = f1.length;

   for(int i = 0;i < len;i++){

    //遞歸調用,處理每個文件對象

    deleteAll(f1[i]);

   }

   //刪除當前文件夾

   f.delete();

  }

 }

}

關於File類的使用就介紹這麼多,其它的方法和使用時需要注意的問題還需要多進行練習和實際使用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved