JAVA I/O (一)

一、關於I/O
什麼是I/O?
I:Input 輸入
O:output 輸出
這裏的輸入、輸出是針對於當前的應用程序而言的。
輸出:應用程序把數據輸出到:"控制檯"、“文件”、“網絡”、“打印機”……
輸入:把數據讀取到應用程序中:“鍵盤”、“網絡”……
 
二、關於Java文件
 
2.1 文件的構造
關於表示文件的類:java.io.File
它是文件和目錄路徑名的抽象表示形式
文件和目錄(文件夾)都是有File對象來表示,注意:要表示文件和目錄都要使用對應的路徑名
如我們要得到磁盤中的文件的對象(如:D:\a.txt)
代碼如下:
File file = new File("D:\\a.txt");
對麼要表示一個文件夾則代碼如下
File file1 = new File("D:\\");
注意: 這裏的路徑中的分隔符使用了兩個\\是由於單個的\會被認爲是轉義字符來處理,\\則表示轉義爲一個\
我們看一看File的構造方法
public File(String pathname) {
    if (pathname == null) {
        throw new NullPointerException();
    }
    this.path = fs.normalize(pathname);
    this.prefixLength = fs.prefixLength(this.path);
}
這裏看到我們要構造一個File對象的時候轉入了一個路徑。
 
2.2 文件路徑
我們拿到這個文件對像後我們如何獲取它的路徑呢?
通過對象調用方法getPath,來獲得path屬性的值(注意:getPath獲取的值與構造時傳入的值相關,構造時傳入的是什麼則返回什麼)
file.getPath();
注意:獲取到的path屬性的值中的路徑分隔符也只會有一個\
我們寫這個路徑的分隔符時每次都要記得使用兩個\\以便轉義,另外還有一種通用的寫法就是/
\\與/的區別:
\\:windows操作系統中可識別
/:是一種通用的寫法,在其它的系統中(如:linux、網絡)都可以識別(建議使用)
還有一種對於分隔符的寫法:File f = new File("d:" +File.separator+"a.txt");
注意:這種寫法書寫上會相對複雜,每一個分隔符處都要使用File.separator進行替換
使用File類中的常量:
public static final char separatorChar = fs.getSeparator();
public static final String separator = "" + separatorChar;
 
路徑的分類
在構造時除了上面路徑的格式外,還有以下幾種形式,如下所示:
    File file1 = new File("../../javaio/1.txt");
    File file2 = new File("/javaio/2.txt");
    File file3 = new File("javaio/3.txt");
    File file4 = new File("D:/1.txt");
創建對象時傳入的路徑:getPath()
這個時候進行getPath分別獲取file1,file2,file3的路徑結果如下
    System.out.println("-----------------getPath()---------------------");
    System.out.println("path1 = " + file1.getPath());
    System.out.println("path2 = " + file2.getPath());
    System.out.println("path3 = " + file3.getPath());
    System.out.println("path4 = " + file4.getPath());
這個時候輸出的結果如下:
-----------------getPath()---------------------
path1 = ..\..\javaio\1.txt
path2 = \javaio\2.txt
path3 = javaio\3.txt
path4 = D:\1.txt
 
絕對路徑,調用getAbsolutePath()方法:
    System.out.println("---------------getAbsolutePath()---------------");
    System.out.println("AbsolutePath1 = " + file1.getAbsolutePath());
    System.out.println("AbsolutePath2 = " + file2.getAbsolutePath());
    System.out.println("AbsolutePath3 = " + file3.getAbsolutePath());
    System.out.println("AbsolutePath4 = " + file4.getAbsolutePath());
這個時候輸出的結果如下:
---------------getAbsolutePath()---------------
AbsolutePath1 = D:\IdeaProjects\SEDemo\..\..\javaio\1.txt
AbsolutePath2 = D:\javaio\2.txt
AbsolutePath3 = D:\IdeaProjects\SEDemo\javaio\3.txt
AbsolutePath4 = D:\1.txt
 
我們從上面輸出的結果可以看到它把當前應用所在的目錄加上去了。
    注意:
        file4由於初始化的時候就已經是一個絕對路徑了所以它沒有拼上我們當前就用所在的目錄
        file2由於我們初始化的時候是/開頭表示根目錄,那這裏的根目錄是表示我們應用程序文件所在磁盤的根目錄,它是在D盤所以這裏顯示爲D:\javaio\2.txt
 
規範路徑,調用getCanonicalPath()方法
    System.out.println("--------------getCanonicalPath()---------------");
    System.out.println("CanonicalPath1 = " + file1.getCanonicalPath());
    System.out.println("CanonicalPath2 = " + file2.getCanonicalPath());
    System.out.println("CanonicalPath3 = " + file3.getCanonicalPath());
    System.out.println("CanonicalPath4 = " + file4.getCanonicalPath());
這個時候輸出的結果如下:
--------------getCanonicalPath()---------------
CanonicalPath1 = D:\javaio\1.txt
CanonicalPath2 = D:\javaio\2.txt
CanonicalPath3 = D:\IdeaProjects\SEDemo\javaio\3.txt
CanonicalPath4 = D:\1.txt
從規範路徑我們可以看到像..\這樣的路徑已經沒有了,會自動把這個路徑所在的位置解析出來
 
2.3 文件名稱
需要獲取文件名稱,可以調用方法:getName(),如下面的代碼:
    File file = new File("D:/download/hello.txt");
    System.out.println("文件名:" + file.getName());
這個時候運行輸出的結果爲:
文件名:hello.txt
注意:文件名稱是包含擴展名稱的
如果我們想要獲取後綴的擴展名稱我們需要自己使用String的方法來進行截取操作
    String ext = fileName.substring(fileName.lastIndexOf('.'));
    System.out.println("文件名後綴:" + ext);
運行後的結果如下:
文件名後綴:.txt
另一種方式獲取文件的後綴名方法
    String[] splits = fileName.split("\\.");
    System.out.println("文件名後綴:." + splits[splits.length-1]);
運行後的結果如下:
文件名後綴:.txt
 
2.4 文件的大小
調用文件對象的length()方法,可以獲取到文件的字節大小
    System.out.println("文件大小(字節):" + file.length());
返回的結果如下:
文件大小(字節):14
關於length()方法跟蹤源碼如下:
 
public long length() {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkRead(path);
    }
    if (isInvalid()) {
        return 0L;
    }
    return fs.getLength(this);
}

final boolean isInvalid() {
    if (status == null) {
        status = (this.path.indexOf('\u0000') < 0) ? PathStatus.CHECKED
                                                   : PathStatus.INVALID;
    }
    return status == PathStatus.INVALID;
}

 

注意:
   1.它判斷當前的文件對象的path是否有效,如果無效則返回的結果是0,否則會計算文件的大小(當我們new出來一個路徑不存在的文件對象,調用length方法時返回的結果爲0L)
    2.length方法可以獲取文件的大小但是不可以獲取目錄的大小
 
2.5 文件修改時間
調用lastModified()
    Calendar c = new Calendar.Builder().setInstant(file.lastModified()).build();
    SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
    System.out.println("最後修改時間:" + sdf.format(c.getTime()).toString());
運行結果如下:
最後修改時間:2020-06-21 18:42:09
注意:lastModified方法返回的是一個毫秒值,需要使用時間相關的類進行格式化操作
 
2.6 獲取文件的父目錄
調用getParent方法獲取,它返回的是上級的目錄名稱
調用getParentFile方法獲取,它返的是上級目錄的文件對象
注意:如果只是爲了拿到上級目錄的名稱可以使用getParent方法,如果需要在拿到了上級目錄對象後再進行操作則可以使用getParentFile方法
    System.out.println("文件:" + file.getCanonicalPath() + ",它的父目錄:" + file.getParent());
運行後結果如下:
文件:D:\download,它的父目錄:D:\
 
2.7 獲取下一級文件
調用list方法會返回一個String[],存放了下一級文件的名稱
調用listFiles方法返回的是一個File[],存放下一級的文件對象
注意:如果只是爲了拿到下一級的文件名稱則可以使用list方法;如果在拿到下一級的文件後還需要進行後續的操作建議使用listFiles方法
    System.out.println("文件:" + file.getCanonicalPath() + "的下級文件:");
    String[] list = file.list();
    for (String s : list) {
    System.out.println(s);
    }
運行後的結果如下:
文件:D:\download的下級文件:
hello.txt
xie
注意:如果指定的文件不存在可者它本身不是一個目錄則會返回null,這個時候我們如上進行遍歷會產生空指針異常
 
2.8 文件判斷
   1.是否存在文件 file.exists()
   2.判斷是否爲文件 file.isFile()
  1. 判斷是否爲目錄 file.isDirectory()
  2. (只讀、可寫、是否隱藏……)
注意:如果我們的file對象對應的文件不存在時上述三個返回的結果都會是false
 
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章