1. 程式人生 > >File類總結

File類總結

exc flv ioe 都在 文件 原始的 布爾 例如 全局常量

File類總結

  • 所在包:java.io
  • File類直接繼承Object類,實現了兩個接口 SerializableComparable<File>
  • File類的全局常量:路徑分隔符 separator 註意註意註意:全局常量在此處使用了小寫字母

    public static final String separator
  • 註意:IO部分到處都在拋異常,我們暫時全忽略,主方法上加throws Exception
  • File類最常用的構造函數 public File(String pathname) 舉例如下:

    File file = new File("d:" + File.separator + "123" + File.separator + "456.txt") ;
    // 如果要用當前目錄的話,就是 "." + File.separator + ......"
  • File類其它構造函數(沒有無參構造)

    public File(File parent,String child)  // 在andriod開發上使用比較多,比如先取得系統規劃的SD卡父目錄,然後再加上自己定義的子目錄
    public File(String parent,String child)
    public File(URI uri)
  • 關於路徑的說明:

    public File(String pathname)
    這裏的路徑參數使用的是String類型的參數,那舉例說明:
    1、假設要訪問D盤根目錄下的text.txt文件,那pathname="d:\text.txt" ,此時問題出現了,\t代表的是制表符,所以程序會報錯。
    2、假設要訪問D盤根目錄下的demo.txt文件,那pathname="d:\demo.txt" ,此時沒有任何問題。
    3、基於以上兩點,為了保險起見,我們需要將\轉義,即\\ .例如:pathname="d:\\text.txt" 或 pathname="d:\\demo.txt" 都是正確的。
    4、但是,在linux下分隔符是/這樣兒的斜線,所以為了統一,就使用到了File類的常量separator 即:pathname="d:" + File.separator + "demo.txt" 
    5、當然,linux下也沒有d盤,關於這個問題暫時保留,我後面再研究。
  • 創建文件方法:createNewFile() , 返回布爾值 public boolean createNewFile() throws IOException

    File file = new File("d:" + File.separator + "123.txt") ;
    System.out.println(file.createNewFile()) ;
  • 刪除文件方法:delete() 返回布爾值 public boolean delete()

    File file = new File("d:" + File.separator + "123.txt") ;
    System.out.println(file.createNewFile()) ;
    Thread.sleep(2000) ;
    System.out.println(file.delete()) ;
  • 判斷文件是否存在的方法 exists() 返回布爾值 public boolean exists()

    File file = new File("d:" + File.separator + "123.txt") ;
    // 如果文件存在,就刪除,不存在,就創建
    if (file.exists()) {
    System.out.println(file.delete()) ;
    } else {
    System.out.println(file.createNewFile()) ;
    }
  • 判斷是否是文件 isFile() 返回布爾值 public boolean isFile()

    // 給出的路徑目錄或文件不存在的話,那就必然會返回false
    File file = new File("d:" + File.separator + "123.txt") ;
    System.out.println(file.isFile()) ;
  • 判斷是否是文件 isDirectory() 返回布爾值 public boolean isDirectory()

    // 給出的路徑目錄或文件不存在的話,那就必然會返回false
    File file = new File("d:" + File.separator + "123.txt") ;
    System.out.println(file.isDirectory()) ;
  • 得到父目錄 getParent() ,返回值 String public String getParent()
  • 得到父目錄 getParentFile() ,返回值 File public File getParentFile()

    File file = new File("d:" + File.separator + "123" + File.separator + "456" + File.separator + "789.txt") ;
    String str = file.getParent() ;
    File file2 = file.getParentFile() ;
    System.out.println(str) ;
    System.out.println(file2) ;
    因為getParentFile() 返回值 File,而取得File類型對象就可以使用File類的很多方法了,所以工作中取得父目錄時大部分是要使用getParentFile()方法的。
  • 創建目錄方法:mkdir() 返回布爾值 public boolean mkdir()
  • 創建目錄方法:mkdirs() 返回布爾值 public boolean mkdirs()

    File file = new File("d:" + File.separator + "123" + File.separator + "456" + File.separator + "789.txt") ;
    if (!file.getParentFile().exists()) file.getParentFile().mkdirs() ;
    if (!file.exists()) file.createNewFile() ;
  • 取得文件大小方法:length() 返回值long public long length()

    // 返回結果為原始的long型字節
    File file = new File("d:" + File.separator + "1.flv") ;
    if (file.isFile()) {
    System.out.println("文件大小:" + file.length() + "Byte");
    }
    // 字節/1024/1024 得到M
    File file = new File("d:" + File.separator + "1.flv") ;
    if (file.isFile()) {
    System.out.println("文件大小:" + file.length()/1024/1024 + "M");
    }
    // 以為因數據類型是long而沒有小數,再改造,在第一個long處強制轉換為double
    File file = new File("d:" + File.separator + "1.flv") ;
    if (file.isFile()) {
    System.out.println("文件大小:" + (double)file.length()/1024/1024 + "M");
    }
    // 以上結果為小數,但小數位數太多,再改造,留兩位小數 
    File file = new File("d:" + File.separator + "1.flv") ;
    if (file.isFile()) {
    System.out.println("文件大小:" + new BigDecimal((double)file.length()/1024/1024).divide(new BigDecimal(1),2,BigDecimal.ROUND_HALF_UP) + "M");
    }
  • 取得最近一次修改時間:lastModified() 返回值long public long lastModified()

    // 返回結果為原始的long型字節
    File file = new File("d:" + File.separator + "1.flv") ;
    if (file.isFile()) {
    System.out.println("最近一次修改時間:" + file.lastModified());
    }
    // long 轉 Date
    File file = new File("d:" + File.separator + "1.flv") ;
    if (file.isFile()) {
    System.out.println("最近一次修改時間:" + new Date(file.lastModified()));
    }
    // 格式化顯示Date
    File file = new File("d:" + File.separator + "1.flv") ;
    if (file.isFile()) {
    System.out.println("最近一次修改時間:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(file.lastModified())));
    }
  • 可讀 canRead() 可寫 canWrite() 可執行canExecute()

    canExecute() 方法在linux下才有效,windows下沒有此屬性,在windows下,大部分情況下canExecute()是返回true
    windows下的這三種屬性與安全權限無關,只與文件屬性有關,linux 系統下的情況待測。
  • 取得文件名 getName() 返回 String public String getName()

    如果路徑中僅有盤符,則返回空
    正常則返回最後一個分隔符部分,無論最後一部分是文件還是目錄,無論文件存不存在,都會返回其對應的名字
  • 取得路徑 getPath() 返回 String public String getPath()

    如果路徑中僅有盤符,照常返回
    無論最後一部分是文件還是目錄,無論文件存不存在,都會返回完整路徑,包含文件名(如果有)。
  • 列出目錄下的目錄和文件 list() 返回值 String[] public String[] list()
  • 列出目錄下的目錄和文件 listFiles() 返回值 File[] public File[] listFiles()
  • 因 listFiles() 方法返回值是File數組,利用File類的很多方法可以繼續做很多事情,所以工作中用 listFiles() 的機會很多,用list()方法的情況很少。用list()還有一個非常不好的地方,就是列出來的文件和目錄只有名字,沒有完整路徑,這樣兒即使是想增強功能都難了。

    //列出 d 盤下所有的文件和文件夾
    File file = new File("d:" + File.separator) ;
    File[] fileArray = file.listFiles() ;
    for (File x : fileArray) {
    System.out.println(x) ;
    }
    //列出 d 盤下所有的文件和文件夾(包含子目錄)
    public static void main(String[] args) {
    File file = new File("d:" + File.separator) ;
    if (file.isDirectory() && file.listFiles() != null) print(file) ;
    }
    public static void print(File x) {
    for (File f : x.listFiles() ) {
        if (f.isDirectory() && f.listFiles() != null) print(f) ;
        System.out.println(f) ;
    }
    }

    綜合練習(做一個資源管理器)

  • 依次顯示 名稱 -- 修改日期 -- 類型 -- 大小

    File file = new File("d:" + File.separator) ;
    File[] fileArray = file.listFiles() ;
    for (File x : fileArray) {
    String str = x.getName() + "\t" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(x.lastModified())) + "\t" + (x.isDirectory()?"文件夾":"文件") + "\t" + (x.isFile()?(new BigDecimal((double)x.length()/1024/1024).divide(new BigDecimal(1),2,BigDecimal.ROUND_HALF_UP) + "M"):"") ;
    System.out.println(str);
    }

File類總結