java I/O———File文件操作類

如果要學好IO,必須清楚抽象類;IO的操作部分重點掌握兩個代碼模型。IO的核心組成就是五個類(File、OutputStream、InputStream、Reader、Writer)一個接口(Serializable)

在Java.io包之中,File類是唯一一個與文件本身操作(創建、刪除、取得信息…)有關的程序類。

File類使用

**java.io.File類是一個普通的類,直接產生實例化對象即可。如果要實例化對象則需要使用到兩個構造方法:

  • public File(String pathname) ;
  • public File(String parent, String child),設置父路徑和子路徑。

**如果要想進行文件的基本操作,可以使用File類的如下方法:

①創建一個新文件 :

public boolean createNewFile() throws IOException

範例:創建新文件

import java.io.File;
import java.io.IOException;
public class TestIO {
    public static void main(String[] args) {
    // 定義要操作的文件路徑
        File file = new File("/Users/yuisama/Desktop/TestIO.java");
        try {
            file.createNewFile() ;
            } catch (IOException e) {
                 e.printStackTrace();
            }
        }
   }

File類只是創建文件本身,但是對於其內容並不做處理。

②判斷文件是否存在:

public boolean exists()

③刪除文件:

public boolean delete()

範例:編寫文件的基本操作(如果文件不存在則進行創建;存在則刪除)

在這裏插入圖片描述
以上實現了最簡化的文件處理操作,但是代碼存在兩個問題:

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

// separator由不同操作系統下的JVM來決定到底是哪個槓槓!
File file = new File(File.separator + "Users" + File.separator + "yuisama" +
   File.separator + "Desktop" + File.separator + "TestIO.java");

在Java中要進行文件的處理操作是要通過本地操作系統支持的,在這之中如果操作的是同名文件,就可能出現延遲的問題。(開發之中儘可能避免文件重名問題)

目錄操作

File類中關於目錄有如下方法:

*取得父路徑或父File對象:

public String getParent()
public File getParentFile()

若想創建父路徑,此時最好取得父路徑的File類對象。

*創建目錄(無論有多少級父目錄,都會創建)

public boolean mkdirs()

範例:Java文件目錄操作
在這裏插入圖片描述

以上判斷父目錄是否存在以及父目錄的創建操作非常重要,對於後續開發很重要。

文件信息

在File類裏面提供有一系列取得文件信息的操作:

  • 判斷路徑是否是文件: public boolean isFile()
  • 判斷路徑是否是目錄: public boolean isDirectory()
  • 取得文件大小(字節): public long length()
  • 最後一次修改日期 : public long lastModified()

範例:取得文件信息

在這裏插入圖片描述
以上操作都是針對文件進行信息取得,Java裏也提供有如下方法列出一個目錄的全部組成:public File[] listFiles()

範例:列出目錄中的全部組成

import java.io.File;
import java.io.IOException;
public class TestIO {
public static void main(String[] args) throws IOException {
// 要操作的文件
      File file = new File(File.separator + "Users" + File.File.separator + "yuisama" + File.separator + "Desktop");
// 保證是個目錄且存在
    if (file.exists() && file.isDirectory()) {
// 列出目錄中的全部內容
        File[] result = file.listFiles() ;
        for (File file2 : result) {
             System.out.println(file2);
        }
    }
}

以上這些操作可以取得本地文件的相關信息

綜合案例(目錄列表)

雖然File提供有listFiles()方法,但是這個方法本身只能夠列出本目錄中的第一級信息。如果要求列出目錄中所有級的信息,必須自己來處理。這種操作就必須通過遞歸的模式來完成。

範例:遞歸打印當前目錄下所有層級的文件信息

在這裏插入圖片描述

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

範例:新增子線程進行耗時操作
在這裏插入圖片描述

對於以上操作,如果將輸出變爲刪除就可以成爲一個惡意程序了。

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