摘要:返回一個(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基石:PathJava7中文件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.txt4 移除冗余項(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, fil6 遍歷一個(gè)文件夾
Path dir = Paths.get("D:Java"); try(DirectoryStreamstream = 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"); Listresult = 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
摘要:從通道進(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...
摘要:會(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 - ...
摘要:解決中的容器文件不能持久的問(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...
摘要:將參數(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...
閱讀 3829·2023-04-25 21:09
閱讀 3157·2021-10-20 13:48
閱讀 3107·2021-09-24 10:25
閱讀 2971·2021-08-21 14:08
閱讀 1823·2019-08-30 15:56
閱讀 1009·2019-08-30 15:52
閱讀 1891·2019-08-29 14:11
閱讀 3596·2019-08-29 11:01