java基礎-文件處理

參考:https://blog.csdn.net/weixin_43683536/article/details/89498287

https://www.cnblogs.com/cocoxu1992/p/10460994.html

https://www.cnblogs.com/2019wxw/p/10962881.html

https://blog.csdn.net/cc1969281777/article/details/82016671

https://www.jianshu.com/p/be1af489551c

https://blog.csdn.net/alan19931103/article/details/48502283?utm_source=blogxgwz6

文件的概念:一種計算機中數據的存儲格式,文件的類型可以自己定義,如.txt,.pdf等。

java提供了文件的創建、刪除以及讀取等操作的API,文件操作是IO操作的一環,對於每個程序員來說都是比較基礎的知識,需要熟練掌握(初次面試時被問到如何刪除文件夾下的所有文件,以及文件過大可能引起的問題,沒有回答上來,很尷尬)

說一說路徑的問題,文件一定是保存在某一目錄下的,而根據這個路徑,我們可以對這個文件進行操作,路徑就像是一個文件的家庭住址。

文件路徑分爲相對路徑和絕對路徑。絕對路徑,就是指全路徑名,如F:\bdidu\a.txt,這是一個寫死的路徑。相對路徑,指文件相對當前路徑所在的路徑,如./a.txt    ../../a.txt ,這裏不贅述了。

在java中,文件以文件名.後綴名形式存儲,文件名區分大小寫,且涉及到文件分隔符的時候,由於windows和linux的文件分隔符不同,建議統一使用File.separator來代替分隔符,也避免了java中對 \ 的繁瑣轉義操作。

接下來就要說到大名鼎鼎的File類了

先看一下構造

File(String pathname) 通過將給定路徑名字符串轉換爲抽象路徑名來創建一個新 File 實例。
File(String parent,String child) 根據指定的父路徑和文件路徑創建一個新File對象實例
File(File parent,String child) 根據指定的父路徑對象和文件路徑創建一個新的File對象實例

都是通過路徑來創建一個文件,只是形式不同,第一種還是最常用的

/*
 - File的構造函數
 - */
 public static void main(String[] args) {
     //File(String pathname)  將指定路徑名轉換成一個File對象
     File file = new File("D:\\1.txt");
     System.out.println(file);
     //File(String parent,String child) 根據指定的父路徑和文件路徑創建File對象
     File file1 =  new File("D:\\a","1.txt");
     System.out.println(file1);
     //File(File parent,String child) 根據指定的父路徑對象和文件路徑創建File對象
     File parent = new File("D:\\a");
     File file2 = new File(parent, "1.txt");
     System.out.println(file2);
     File file3 = new File(new File("D:\\a"),"1.txt");
     System.out.println(file3);

 }

常用方法如下

創建:
createNewFile()在指定位置創建一個空文件,成功就返回true,如果已存在就不創建,然後返回false。
mkdir() 在指定位置創建一個單級文件夾。
mkdirs() 在指定位置創建一個多級文件夾。
renameTo(File dest)如果目標文件與源文件是在同一個路徑下,那麼renameTo的作用是重命名, 如果目標文件與源文件不是在同一個路徑下,那麼renameTo的作用就是剪切,而且還不能操作文件夾。

刪除:
delete() 刪除文件或者一個空文件夾,不能刪除非空文件夾,馬上刪除文件,返回一個布爾值。
deleteOnExit()jvm退出時刪除文件或者文件夾,用於刪除臨時文件,無返回值。
判斷:
exists() 文件或文件夾是否存在。
isFile() 是否是一個文件,如果不存在,則始終爲false。
isDirectory() 是否是一個目錄,如果不存在,則始終爲false。
isHidden() 是否是一個隱藏的文件或是否是隱藏的目錄。
isAbsolute() 測試此抽象路徑名是否爲絕對路徑名。
獲取:
getName() 獲取文件或文件夾的名稱,不包含上級路徑。
getAbsolutePath()獲取文件的絕對路徑,與文件是否存在沒關係
length() 獲取文件的大小(字節數),如果文件不存在則返回0L,如果是文件夾也返回0L。
getParent() 返回此抽象路徑名父目錄的路徑名字符串;如果此路徑名沒有指定父目錄,則返回null。
lastModified()獲取最後一次被修改的時間。

文件夾相關:
static File[] listRoots()列出所有的根目錄(Window中就是所有系統的盤符)
list() 返回目錄下的文件或者目錄名,包含隱藏文件。對於文件這樣操作會返回null。
listFiles() 返回目錄下的文件或者目錄對象(File類實例),包含隱藏文件。對於文件這樣操作會返回null。
list(FilenameFilter filter)返回指定當前目錄中符合過濾條件的子文件或子目錄。對於文件這樣操作會返回null。
listFiles(FilenameFilter filter)返回指定當前目錄中符合過濾條件的子文件或子目錄。對於文件這樣操作會返回null。

此外,設置只讀屬性也是常用方法之一,setReadOnly();單一的談論API沒有實際價值,文件往往是結合其它技術一起使用,如文件的上傳、下載,完成某個操作後刪除某個文件夾下的所有文件等,這裏,我們舉例說明。

關於HTTP的文件斷點續傳。可以查看我之前的HTTP學習的博客,裏面有提到,這裏不再贅述。

關於javaweb的文件上傳,請移步 https://blog.csdn.net/cc1969281777/article/details/82016671

使用springboot實現文件上傳和下載請移步 https://www.jianshu.com/p/be1af489551c

循環遍歷刪除某文件夾下的全部文件:這裏注意,delete()方法只能直接刪除沒有內容的文件夾,若有內容,需要先刪除其中內容才能刪除文件夾,所以直接調用delete方法是不可行的。

public boolean deleteFile(String path) {// 刪除文件|目錄(連聯刪除)
        File file = new File(path);
        if (!file.exists()) {
            System.out.println("文件不存在!");
            return false;
        }        
        dfsdelete(path);
        return true;
    }

    public void dfsdelete(String path) {
        File file=new File(path);
        if(file.isFile()) {//如果此file對象是文件的話,直接刪除
            file.delete();
            return;
        }
        //當 file是文件夾的話,先得到文件夾下對應文件的string數組 ,遞歸調用本身,實現深度優先刪除
            String [] list=file.list();
            for (int i = 0; i < list.length; i++) {
                dfsdelete(path+File.separator+list[i]);
                
            }//當把文件夾內所有文件刪完後,此文件夾已然是一個空文件夾,可以使用delete()直接刪除
            file.delete();
        return;
    }

 

這種方法也不完善,在方法中調用自身,這種遞歸操作可能因爲棧內存得不到釋放而導致內存溢出,照着網上的說法,可以轉換成兩個方法的互相調用,實現調用B方法時,釋放A方法佔用的棧內存,由此來避免遞歸調用時數據過大引起的內存溢出的問題。由於對jvm瞭解不深刻,這樣是否可行我也沒有辦法驗證,不過我還是實現了這種寫法,提供出來,僅供參考。

package com.deleteFile;

import java.io.File;
//避免OOM的遍歷刪除文件的方法
public class DeleteFileUtil {

    public void doDelete(String fileParh){
        File file = new File(fileParh);
        if(file.isFile()){
            file.delete();
            return;
        }
        else{
            //調用另一方法,釋放之前方法的棧內存
            doDeleteHelper(fileParh);
            file.delete();
        }
        return;
    }
    public void doDeleteHelper(String filePath){
        File file = new File(filePath);
        String [] fileList = file.list();
            for (int i = 0; i < fileList.length; i++) {
                filePath = filePath +File.separator + fileList[i];
                doDelete(filePath);
            }

    }

    public static void main(String[] args) {
        DeleteFileUtil util = new DeleteFileUtil();
        util.doDelete("E:\\aaa");


    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章