成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java NIO之擁抱Path和Files

DevYK / 2360人閱讀

摘要:返回一個(gè)路徑,該路徑是冗余名稱元素的消除。本節(jié)教程將覆蓋大部分方法。在本例中,這個(gè)數(shù)組內(nèi)包含了,表示檢測(cè)時(shí)不包含符號(hào)鏈接文件。遍歷整個(gè)文件目錄接受一個(gè)和作為參數(shù)。

Java面試通關(guān)手冊(cè)(Java學(xué)習(xí)指南)github地址(歡迎star和pull):https://github.com/Snailclimb/Java_Guide

歷史回顧:

Java NIO 概覽

Java NIO 之 Buffer(緩沖區(qū))

Java NIO 之 Channel(通道)

Java NIO之Selector(選擇器)

其他高贊文章:

面試中關(guān)于Redis的問(wèn)題看這篇就夠了

一文輕松搞懂redis集群原理及搭建與使用

超詳細(xì)的Java面試題總結(jié)(三)之Java集合篇常見問(wèn)題

一 文件I/O基石:Path

Java7中文件IO發(fā)生了很大的變化,專門引入了很多新的類來(lái)取代原來(lái)的基于java.io.File的文件IO操作方式:

import java.nio.file.DirectoryStream;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileAttribute;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;·

......等等

我們將從下面幾個(gè)方面來(lái)學(xué)習(xí)Path類:

創(chuàng)建一個(gè)Path

File和Path之間的轉(zhuǎn)換,F(xiàn)ile和URI之間的轉(zhuǎn)換

獲取Path的相關(guān)信息

移除Path中的冗余項(xiàng)

1 創(chuàng)建一個(gè)Path

創(chuàng)建Path實(shí)例可以通過(guò) Paths工具類get()方法:

//使用絕對(duì)路徑
 Path path= Paths.get("c:datamyfile.txt");
//使用相對(duì)路徑
Path path = Paths.get("/home/jakobjenkov/myfile.txt");

下面這種創(chuàng)建方式和上面等效:

Path path = FileSystems.getDefault().getPath("c:datamyfile.txt");
2 File和Path之間的轉(zhuǎn)換,F(xiàn)ile和URI之間的轉(zhuǎn)換
        File file = new File("C:/my.ini");
        Path p1 = file.toPath();
        p1.toFile();
        file.toURI();
3 獲取Path的相關(guān)信息
        //使用Paths工具類的get()方法創(chuàng)建
        Path path = Paths.get("D:XMindcl-java.txt");
/*        //使用FileSystems工具類創(chuàng)建
        Path path2 = FileSystems.getDefault().getPath("c:datamyfile.txt");*/
        System.out.println("文件名:" + path.getFileName());
        System.out.println("名稱元素的數(shù)量:" + path.getNameCount());
        System.out.println("父路徑:" + path.getParent());
        System.out.println("根路徑:" + path.getRoot());
        System.out.println("是否是絕對(duì)路徑:" + path.isAbsolute());
        //startsWith()方法的參數(shù)既可以是字符串也可以是Path對(duì)象
        System.out.println("是否是以為給定的路徑D:開始:" + path.startsWith("D:") );
        System.out.println("該路徑的字符串形式:" + path.toString());

結(jié)果:

文件名:bcl-java.txt
名稱元素的數(shù)量:2
父路徑:D:XMind
根路徑:D:
是否是絕對(duì)路徑:true
是否是以為給定的路徑D:開始:true
該路徑的字符串形式:D:XMindcl-java.txt
4 移除冗余項(xiàng)

某些時(shí)候在我們需要處理的Path路徑中可能會(huì)有一個(gè)或兩個(gè)點(diǎn)

.表示的是當(dāng)前目錄

..表示父目錄或者說(shuō)是上一級(jí)目錄:

下面通過(guò)實(shí)例來(lái)演示一下使用Path類的normalize()和toRealPath()方法把.和..去除。

normalize() : 返回一個(gè)路徑,該路徑是冗余名稱元素的消除。

toRealPath() : 融合了toAbsolutePath()方法和normalize()方法

        //.表示的是當(dāng)前目錄
        Path currentDir = Paths.get(".");
        System.out.println(currentDir.toAbsolutePath());//輸出C:UsersAdministratorNIODemo.
        Path currentDir2 = Paths.get(".NIODemo.iml");
        System.out.println("原始路徑格式:"+currentDir2.toAbsolutePath());
        System.out.println("執(zhí)行normalize()方法之后:"+currentDir2.toAbsolutePath().normalize());
        System.out.println("執(zhí)行toRealPath()方法之后:"+currentDir2.toRealPath());

        //..表示父目錄或者說(shuō)是上一級(jí)目錄:
        Path currentDir3 = Paths.get("..");
        System.out.println("原始路徑格式:"+currentDir3.toAbsolutePath());
        System.out.println("執(zhí)行normalize()方法之后:"+currentDir3.toAbsolutePath().normalize());
        System.out.println("執(zhí)行toRealPath()方法之后:"+currentDir3.toRealPath());

結(jié)果:

C:UsersAdministratorNIODemo.
原始路徑格式:C:UsersAdministratorNIODemo.NIODemo.iml
執(zhí)行normalize()方法之后:C:UsersAdministratorNIODemoNIODemo.iml
執(zhí)行toRealPath()方法之后:C:UsersAdministratorNIODemoNIODemo.iml
原始路徑格式:C:UsersAdministratorNIODemo..
執(zhí)行normalize()方法之后:C:UsersAdministrator
執(zhí)行toRealPath()方法之后:C:UsersAdministrator

二 擁抱Files類

Java NIO中的Files類(java.nio.file.Files)提供了多種操作文件系統(tǒng)中文件的方法。本節(jié)教程將覆蓋大部分方法。Files類包含了很多方法,所以如果本文沒(méi)有提到的你也可以直接查詢JavaDoc文檔。

java.nio.file.Files類是和java.nio.file.Path相結(jié)合使用的

1 檢查給定的Path在文件系統(tǒng)中是否存在

通過(guò) Files.exists() 檢測(cè)文件路徑是否存在:

       Path path = Paths.get("D:XMindcl-java.txt");

        boolean pathExists =
                Files.exists(path,
                        new LinkOption[]{LinkOption.NOFOLLOW_LINKS});
        System.out.println(pathExists);//true

注意Files.exists()的的第二個(gè)參數(shù)。它是一個(gè)數(shù)組,這個(gè)參數(shù)直接影響到Files.exists()如何確定一個(gè)路徑是否存在。在本例中,這個(gè)數(shù)組內(nèi)包含了LinkOptions.NOFOLLOW_LINKS,表示檢測(cè)時(shí)不包含符號(hào)鏈接文件。

2 創(chuàng)建文件/文件夾

創(chuàng)建文件:

通過(guò) Files.createFile() 創(chuàng)建文件,

        Path target2 = Paths.get("C:mystuff.txt");
        try {
            if(!Files.exists(target2))
                Files.createFile(target2);
        } catch (IOException e) {
            e.printStackTrace();
        }

創(chuàng)建文件夾:

通過(guò) Files.createDirectory() 創(chuàng)建文件夾

通過(guò) Files.createDirectories() 創(chuàng)建文件夾

Files.createDirectories()會(huì)首先創(chuàng)建所有不存在的父目錄來(lái)創(chuàng)建目錄,而Files.createDirectory()方法只是創(chuàng)建目錄,如果它的上級(jí)目錄不存在就會(huì)報(bào)錯(cuò)。比如下面的程序使用Files.createDirectory() 方法創(chuàng)建就會(huì)報(bào)錯(cuò),這是因?yàn)槲业腄盤下沒(méi)有data文件夾,加入存在data文件夾的話則沒(méi)問(wèn)題。

    Path path = Paths.get("D://data//test");

    try {
        Path newDir = Files.createDirectories(path);
    } catch(FileAlreadyExistsException e){
        // the directory already exists.
    } catch (IOException e) {
        //something else went wrong
        e.printStackTrace();
    }
3 刪除文件或目錄

通過(guò) Files.delete()方法 可以刪除一個(gè)文件或目錄:

Path path = Paths.get("data/subdir/logging-moved.properties");

try {
    Files.delete(path);
} catch (IOException e) {
    //deleting file failed
    e.printStackTrace();
}
4 把一個(gè)文件從一個(gè)地址復(fù)制到另一個(gè)位置

通過(guò)Files.copy()方法可以吧一個(gè)文件從一個(gè)地址復(fù)制到另一個(gè)位置

Path sourcePath      = Paths.get("data/logging.properties");
Path destinationPath = Paths.get("data/logging-copy.properties");

try {
    Files.copy(sourcePath, destinationPath);
} catch(FileAlreadyExistsException e) {
    //destination file already exists
} catch (IOException e) {
    //something else went wrong
    e.printStackTrace();
}

copy操作還可可以強(qiáng)制覆蓋已經(jīng)存在的目標(biāo)文件,只需要將上面的copy()方法改為如下格式:

    Files.copy(sourcePath, destinationPath,
            StandardCopyOption.REPLACE_EXISTING);
5 獲取文件屬性
        Path path = Paths.get("D:XMindcl-java.txt");
        System.out.println(Files.getLastModifiedTime(path));
        System.out.println(Files.size(path));
        System.out.println(Files.isSymbolicLink(path));
        System.out.println(Files.isDirectory(path));
        System.out.println(Files.readAttributes(path, "*"));

結(jié)果:

2016-05-18T08:01:44Z
18934
false
false
{lastAccessTime=2017-04-12T01:42:21.149351Z, lastModifiedTime=2016-05-18T08:01:44Z, size=18934, creationTime=2017-04-12T01:42:21.149351Z, isSymbolicLink=false, isRegularFile=true, fil
6 遍歷一個(gè)文件夾
        Path dir = Paths.get("D:Java");
        try(DirectoryStream stream = Files.newDirectoryStream(dir)){
            for(Path e : stream){
                System.out.println(e.getFileName());
            }
        }catch(IOException e){

        }

結(jié)果:

apache-maven-3.5.0
Eclipse
intellij idea
Jar
JDK
MarvenRespository
MyEclipse 2017 CI
Nodejs
RedisDesktopManager
solr-7.2.1

上面是遍歷單個(gè)目錄,它不會(huì)遍歷整個(gè)目錄。遍歷整個(gè)目錄需要使用:Files.walkFileTree().Files.walkFileTree()方法具有遞歸遍歷目錄的功能。

7 遍歷整個(gè)文件目錄:

walkFileTree接受一個(gè)Path和FileVisitor作為參數(shù)。Path對(duì)象是需要遍歷的目錄,F(xiàn)ileVistor則會(huì)在每次遍歷中被調(diào)用。

FileVisitor需要調(diào)用方自行實(shí)現(xiàn),然后作為參數(shù)傳入walkFileTree().FileVisitor的每個(gè)方法會(huì)在遍歷過(guò)程中被調(diào)用多次。如果不需要處理每個(gè)方法,那么可以繼承它的默認(rèn)實(shí)現(xiàn)類SimpleFileVisitor,它將所有的接口做了空實(shí)現(xiàn)。

public class WorkFileTree {

    public static void main(String[] args) throws IOException{
        Path startingDir = Paths.get("D:apache-tomcat-9.0.0.M17");
        List result = new LinkedList();
        Files.walkFileTree(startingDir, new FindJavaVisitor(result));
        System.out.println("result.size()=" + result.size());
    }

    private static class FindJavaVisitor extends SimpleFileVisitor{
        private List result;
        public FindJavaVisitor(List result){
            this.result = result;
        }
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs){
            if(file.toString().endsWith(".java")){
                result.add(file.getFileName());
            }
            return FileVisitResult.CONTINUE;
        }
    }
}

上面這個(gè)例子輸出了我的D:apache-tomcat-9.0.0.M17也就是我的Tomcat安裝目錄下以.java結(jié)尾文件的數(shù)量。

結(jié)果:

result.size()=4

Files類真的很強(qiáng)大,除了我講的這些操作之外還有其他很多操作比如:讀取和設(shè)置文件權(quán)限、更新文件所有者等等操作。

我這里就介紹這么多了,如果想要詳細(xì)了解的可以自行查閱官方文檔或者相關(guān)書籍。

官方JDK相關(guān)文檔

谷歌搜索排名第一的Java NIO教程

《Java程序員修煉之道》

《Java 8編程官方參考教程(第9版)》

Java7新特性之文件操作

歡迎關(guān)注我的微信公眾號(hào):"Java面試通關(guān)手冊(cè)"(一個(gè)有溫度的微信公眾號(hào),期待與你共同進(jìn)步~~~堅(jiān)持原創(chuàng),分享美文,分享各種Java學(xué)習(xí)資源):

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69397.html

相關(guān)文章

  • 關(guān)于Java IO與NIO知識(shí)都在這里

    摘要:從通道進(jìn)行數(shù)據(jù)寫入創(chuàng)建一個(gè)緩沖區(qū),填充數(shù)據(jù),并要求通道寫入數(shù)據(jù)。三之通道主要內(nèi)容通道介紹通常來(lái)說(shuō)中的所有都是從通道開始的。從中選擇選擇器維護(hù)注冊(cè)過(guò)的通道的集合,并且這種注冊(cè)關(guān)系都被封裝在當(dāng)中停止選擇的方法方法和方法。 由于內(nèi)容比較多,我下面放的一部分是我更新在我的微信公眾號(hào)上的鏈接,微信排版比較好看,更加利于閱讀。每一篇文章下面我都把文章的主要內(nèi)容給列出來(lái)了,便于大家學(xué)習(xí)與回顧。 Ja...

    Riddler 評(píng)論0 收藏0
  • JAVA NIO.2

    摘要:會(huì)自動(dòng)遍歷下的所有文件和目錄,并對(duì)其觸發(fā)中相應(yīng)的方法,并使用方法的返回值來(lái)控制訪問(wèn)器的后續(xù)行為。它的實(shí)例有繼續(xù)不訪問(wèn)兄弟文件或目錄不訪問(wèn)子文件或子目錄終止后續(xù)行為官網(wǎng)實(shí)例刪除所有子文件和子目錄是一個(gè)接口,定義了監(jiān)聽目錄變化的方法。 簡(jiǎn)介 java 7新增了如下API來(lái)訪問(wèn)文件或者進(jìn)行IO操作 Path - 接口,代表一個(gè)平臺(tái)無(wú)關(guān)的目錄。提供了大量的方法來(lái)操作目錄。 Paths - ...

    TerryCai 評(píng)論0 收藏0
  • 解決Docker Machine中的容器文件不能持久的問(wèn)題

    摘要:解決中的容器文件不能持久的問(wèn)題目前下使用的主流方式還是使用需要借用虛擬器啟動(dòng)一個(gè)宿主機(jī)才能在上面啟動(dòng)多個(gè)容器當(dāng)我們?cè)谌萜髦羞\(yùn)行服務(wù)時(shí)經(jīng)常會(huì)有需要將服務(wù)數(shù)據(jù)持久化的場(chǎng)景比如運(yùn)行集群時(shí)需要將索引數(shù)據(jù)持久保存到磁盤那具體保存到哪里呢容器的無(wú)狀態(tài)特 解決Docker Machine中的容器文件不能持久的問(wèn)題 目前Mac下使用docker的主流方式還是使用Docker machine. Dock...

    Amio 評(píng)論0 收藏0
  • Java JDK11中的新API

    摘要:將參數(shù)的所有字節(jié)寫入輸出流兩個(gè)允許指定的新構(gòu)造函數(shù)。四個(gè)允許指定的新構(gòu)造函數(shù)。返回從此字符串中提取的行的流,由行終止符分隔。如上所述,使用指定的將字符編碼為字節(jié)。返回此表示的執(zhí)行客戶端中的包裝原因,如果原因不存在或未知,則返回。 有關(guān)API更改的完整列表,可在Github上獲得。 這里列出的是除了java.net.http和jdk.jfr模塊之外的所有新方法。沒(méi)有列出java.secu...

    pepperwang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<