1. 程式人生 > >JAVA核心技術I---JAVA基礎知識(檔案系統及java檔案基本操作)

JAVA核心技術I---JAVA基礎知識(檔案系統及java檔案基本操作)

一:檔案概述

檔案系統是由OS(作業系統)管理的
檔案系統和Java程序是平行的,是兩套系統
檔案系統是由資料夾和檔案遞迴組合而成
檔案目錄分隔符
–Linux/Unix 用/隔開
–Windows用\隔開,涉及到轉義,在程式中需用/或\\代替
檔案包括檔案裡面的內容和檔案基本屬性
檔案基本屬性:名稱、大小、副檔名、修改時間等

二:檔案類File

java.io.File是檔案和目錄的重要類(JDK6及以前是唯一)
–目錄也使用File類進行表示
File類與OS無關,但會受到OS的許可權限制
常用方法
–createNewFile,delete,exists, getAbsolutePath, getName, 
getParent,getPath, isDirectory, isFile, length, listFiles, mkdir, mkdirs
注意:File不涉及到具體的檔案內容只涉及屬性

(一)常用方法實現

    public static void main(String[] args) {
        File d = new File("D:\\MyJava\\Code\\JH15\\bin");
        if (!d.exists()) {    //用於判斷是否存在目錄/檔案
            System.out.println("dir not exists");
        }else {
            System.out.println("dir exists
"); } File f = new File("D:\\MyJava\\Code\\JH15\\bin\\test.c"); if(!f.exists()) { System.out.println("file not exist"); try { f.createNewFile(); //建立檔案必須捕獲異常 }catch(IOException e) { System.
out.println("file create fail"+e.getMessage()); } } File dd = new File("D:\\MyJava\\Code\\JH15\\bin\\aa\\bb\\cc"); if(!dd.exists()) { System.out.println("create dirs"); dd.mkdirs(); //mkdir建立一級目錄 mkdirs建立多級目錄 } File fs[] = d.listFiles(); //listFiles返回目錄下的所有檔案(物件) for(File fitem : fs) { //getPath獲取檔案的絕對路徑,getName獲取檔名,length獲取檔案大小,lastModified獲取檔案最後一次修改時間(時間戳) System.out.println(fitem.getPath()+" "+fitem.getName()+" "+fitem.length()+" "+fitem.lastModified()); } }

三:新的檔案系統類(補充File類)

–是java.io.File的有益補充
• 檔案複製和移動
• 檔案相對路徑
• 遞迴遍歷目錄
• 遞迴刪除目錄
• .......

(一)Path, Files

1.Path介面類:Path 和 java.io.File 基本類似

Path表示路徑,可以是檔案的路徑,也可以是目錄的路徑
可用於在檔案系統中定位檔案的物件。 它通常表示系統相關的檔案路徑。 
Path是介面,無法例項化物件,藉助輔助類Paths來實現
Files中所有成員都是靜態方法,通過路徑實現了對檔案的基本操作。
FIles類和Path介面。他們兩封裝了使用者對檔案的所有可能的操作,相比於File類來說,使用起來方便很多。

介面方法:

int compareTo(Path other)              比較兩個抽象的路徑詞典。  
boolean endsWith(Path other)           測試此路徑是否以給定的路徑結束。  
boolean endsWith(String other)         測試此路徑是否以 Path結束,通過轉換給定的路徑字串,完全按照 endsWith(Path)方法指定的方式構建。  
boolean equals(Object other)           測試此路徑與給定物件的相等性。  
Path getFileName()             將此路徑表示的檔案或目錄的名稱返回為 Path物件。  
FileSystem getFileSystem()        返回建立此物件的檔案系統。  
Path getName(int index)          返回此路徑的名稱元素作為 Path物件。  
int getNameCount()             返回路徑中的名稱元素的數量。  
Path getParent()              返回 父路徑 ,或 null如果此路徑沒有父。  
Path getRoot()                返回此路徑的根組分作為 Path物件,或 null如果該路徑不具有根元件。  
int hashCode()               計算此路徑的雜湊碼。  
boolean isAbsolute()           告訴這條路是否是絕對的。  
Iterator<Path> iterator()        返回此路徑的名稱元素的迭代器。  
Path normalize()              返回一個路徑,該路徑是冗餘名稱元素的消除。  
Path relativize(Path other)       構造此路徑和給定路徑之間的相對路徑。  
Path resolve(Path other)         根據這條路徑解決給定的路徑。  
Path resolve(String other)        一個給定的路徑字串轉換為 Path並解析它針對此 Path在完全按規定的方式 resolve方法。  
Path resolveSibling(Path other)     根據此路徑的 parent路徑解決給定的路徑。  
Path resolveSibling(String other)    將給定的路徑字串轉換為 Path ,並按照 resolveSibling方法指定的方式將其解析為該路徑的 parent路徑。  
boolean startsWith(Path other)     測試此路徑是否以給定的路徑開始。  
boolean startsWith(String other)    測試此路徑是否以 Path ,通過轉換給定的路徑字串,按照 startsWith(Path)方法指定的方式構建。  
Path subpath(int beginIndex, int endIndex) 返回一個相對的 Path ,它是該路徑的名稱元素的子序列。  
Path toAbsolutePath()           返回表示此路徑的絕對路徑的 Path物件。  
File toFile()               返回表示此路徑的File物件。  
Path toRealPath(LinkOption... options) 返回現有檔案的 真實路徑。  
String toString()             返回此路徑的字串表示形式。  
....

2.補充Paths類

和Path介面相關的還有一個類Paths,這個類非常簡單,只有兩個方法加一個私有構造方法。

public static Path get(String first, String... more)
將路徑字串或從路徑字串連線起來的一系列字串轉換為Path 。 
如果more沒有指定任何元素,那麼first引數的值是要轉換的路徑字串。
如果more指定一個或多個元素,則每個非空字串(包括first )被認為是名稱元素的序列(參見Path ),並且被連線以形成路徑字串。
關於字串如何連線的細節是提供者特定的,但通常它們將使用name-separator作為分隔符進行連線。
例如,如果名稱分隔符為“ / ”並呼叫getPath("/foo","bar","gus") ,則路徑字串"/foo/bar/gus"將轉換為Path 。
一個Path表示空路徑如果返回first是空字串, more不包含任何非空字串。
引數 
  first - 路徑字串或路徑字串的初始部分 
  more - 要連線的附加字串以形成路徑字串 
結果 
  結果 Path 

3.Files

該類只包含對檔案,目錄或其他型別檔案進行操作的靜態方法。 
整個FIles類中,都是靜態方法,沒有一個例項域。
這個類就是為了實現對檔案的各種操作

java 檔案操作(二)---Files和Path

(二) DirectoryStream, FileVisitor,FileSystem

DirectoryStream

一個物件來迭代目錄中的條目。 目錄流允許方便地使用for-each結構來遍歷目錄。 
Path dir = ...
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
   for (Path entry: stream) {
       ...
   }
} 

FileVisitor

檔案訪問者 該介面的實現被提供給Files.walkFileTree方法來訪問檔案樹中的每個檔案。 

FileSystem

檔案系統的工廠方法。 該類定義了getDefault方法來獲取預設檔案系統和工廠方法來構建其他型別的檔案系統。 

(三)方法實現

1.Path 

        // 獲得path方法一,c:/temp/abc.txt
        Path ph = FileSystems.getDefault().getPath("D:\\MyJava\\Code\\JH16\\bin", "CD.class");
        System.out.println(ph.getFileName());
        
        // 獲得path方法二,用File的toPath()方法獲得Path物件
        File fl = new File("D:\\MyJava\\Code\\JH16\\bin\\CD.class");
        Path phOth = fl.toPath();
        System.out.println(phOth.getFileName());
        // 0,說明這兩個path是相等的
        System.out.println(ph.compareTo(phOth));
        
        // 獲得path方法三
        Path phOth2 = Paths.get("D:\\MyJava\\Code\\JH16\\bin", "CD.class");
        System.out.println(phOth2.getFileName());

        //合併兩個path
        Path phOth3 = Paths.get("D:\\MyJava\\Code\\JH16\\bin");
        System.out.println("Path4:"+phOth3.resolve("CD.class"));
        
        if(Files.isReadable(ph)) {
            System.err.println("file is readable");
        }else {
            System.err.println("file is not readable");
        }
CD.class
CD.class
0
CD.class Path4:D:\MyJava\Code\JH16\bin\CD.class file is readable

2.Files類

 

public class FilesTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        moveFile();
        fileAttributes();
        createDirectory();
    }

    private static void createDirectory() {
        // TODO Auto-generated method stub
        Path ph = Paths.get("D:\\MyJava\\Code\\JH16\\test\\aa\\bb");
        try {
            //建立資料夾
            if(Files.notExists(ph)) {
                Files.createDirectories(ph);    //遞迴建立
                System.out.println("create dir");
            }else {
                System.out.println("dir exists");
            }
            
            //設定檔案路徑
            Path f1 = ph.resolve("A.java");
            Path f2 = ph.resolve("B.jpg");
            Path f3 = ph.resolve("C.txt");
            Path f4 = ph.resolve("D.c");
            
            Files.createFile(f1);
            Files.createFile(f2);
            Files.createFile(f3);
            Files.createFile(f4);
            
            //不加條件遍歷,變數目錄路徑下的所有檔案
            DirectoryStream<Path> paths = Files.newDirectoryStream(ph);
            for(Path p: paths) {
                System.out.println(p.getFileName());
            }
            
            System.out.println("========");
            
            //加上條件過濾,過濾檔案一java txt結尾檔案
            DirectoryStream<Path> pathFielter = Files.newDirectoryStream(ph,"*.{java,txt}");
            for(Path p: pathFielter) {
                System.out.println(p.getFileName());
            }
                    
        }catch(IOException e) {
            e.printStackTrace();
        }
    }

    private static void fileAttributes() {
        // TODO Auto-generated method stub
        Path path = Paths.get("D:\\MyJava");    //獲取路徑
        
        System.out.println(path.isAbsolute());    //判斷是否為絕對路徑
        System.out.println(Files.isDirectory(path));
        
        try {
            //獲取檔案屬性
            //不需要遵循符號連結NOFOLLOW_LINKS
            BasicFileAttributes attrs = Files.readAttributes(path,BasicFileAttributes.class,LinkOption.NOFOLLOW_LINKS);
            //讀取檔案的屬性作為批量操作。 
            System.out.println(attrs.isDirectory());
            System.out.println(attrs.lastModifiedTime());
            System.out.println(attrs.lastModifiedTime().toMillis());
            System.out.println(new Date(attrs.lastModifiedTime().toMillis()));    //時間戳轉時間
            System.out.println(new Date(attrs.lastModifiedTime().toMillis()).toLocaleString());
        }catch(IOException e) {
            e.printStackTrace();
        }
    }

    private static void moveFile() {
        // TODO Auto-generated method stub
        Path form = Paths.get("D:\\MyJava","test.txt");
        Path to = form.getParent().resolve("Code\\JH17\\tt.txt");    //注意這個路徑後面是加上新的檔名
        
        try {
            //path獲取檔名 Files。size獲取檔案大小
            System.out.println(form.getFileName()+": "+Files.size(form));
            //Files.move移動檔案 Files.copy拷貝檔案
            Files.copy(form, to,StandardCopyOption.REPLACE_EXISTING);
        }catch(IOException e) {
            System.err.println(e.getMessage());
        }
    }

}
test.txt: 2014
true
true
true
2019-01-09T02:44:41.085042Z
1547001881085
2019-01-09
2019年1月9日 上午10:44:41
dir exists
D:\MyJava\Code\JH16\test\aa\bb\A.java
A.java
B.jpg
C.txt
D.c
========
A.java
C.txt