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

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

參數 for http inux 兩個 ret delete 圖片 根據

一:文件概述

文件系統是由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

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