摘要:返回一個路徑,該路徑是冗余名稱元素的消除。本節教程將覆蓋大部分方法。在本例中,這個數組內包含了,表示檢測時不包含符號鏈接文件。遍歷整個文件目錄接受一個和作為參數。
Java面試通關手冊(Java學習指南)github地址(歡迎star和pull):https://github.com/Snailclimb/Java_Guide
歷史回顧:
Java NIO 概覽
Java NIO 之 Buffer(緩沖區)
Java NIO 之 Channel(通道)
Java NIO之Selector(選擇器)
其他高贊文章:
面試中關于Redis的問題看這篇就夠了
一文輕松搞懂redis集群原理及搭建與使用
超詳細的Java面試題總結(三)之Java集合篇常見問題
一 文件I/O基石:PathJava7中文件IO發生了很大的變化,專門引入了很多新的類來取代原來的基于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;· ......等等
我們將從下面幾個方面來學習Path類:
創建一個Path
File和Path之間的轉換,File和URI之間的轉換
獲取Path的相關信息
移除Path中的冗余項
1 創建一個Path創建Path實例可以通過 Paths工具類 的 get()方法:
//使用絕對路徑 Path path= Paths.get("c:datamyfile.txt");
//使用相對路徑 Path path = Paths.get("/home/jakobjenkov/myfile.txt");
下面這種創建方式和上面等效:
Path path = FileSystems.getDefault().getPath("c:datamyfile.txt");2 File和Path之間的轉換,File和URI之間的轉換
File file = new File("C:/my.ini"); Path p1 = file.toPath(); p1.toFile(); file.toURI();3 獲取Path的相關信息
//使用Paths工具類的get()方法創建 Path path = Paths.get("D:XMindcl-java.txt"); /* //使用FileSystems工具類創建 Path path2 = FileSystems.getDefault().getPath("c:datamyfile.txt");*/ System.out.println("文件名:" + path.getFileName()); System.out.println("名稱元素的數量:" + path.getNameCount()); System.out.println("父路徑:" + path.getParent()); System.out.println("根路徑:" + path.getRoot()); System.out.println("是否是絕對路徑:" + path.isAbsolute()); //startsWith()方法的參數既可以是字符串也可以是Path對象 System.out.println("是否是以為給定的路徑D:開始:" + path.startsWith("D:") ); System.out.println("該路徑的字符串形式:" + path.toString());
結果:
文件名:bcl-java.txt 名稱元素的數量:2 父路徑:D:XMind 根路徑:D: 是否是絕對路徑:true 是否是以為給定的路徑D:開始:true 該路徑的字符串形式:D:XMindcl-java.txt4 移除冗余項
某些時候在我們需要處理的Path路徑中可能會有一個或兩個點
.表示的是當前目錄
..表示父目錄或者說是上一級目錄:
下面通過實例來演示一下使用Path類的normalize()和toRealPath()方法把.和..去除。
normalize() : 返回一個路徑,該路徑是冗余名稱元素的消除。
toRealPath() : 融合了toAbsolutePath()方法和normalize()方法
//.表示的是當前目錄 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("執行normalize()方法之后:"+currentDir2.toAbsolutePath().normalize()); System.out.println("執行toRealPath()方法之后:"+currentDir2.toRealPath()); //..表示父目錄或者說是上一級目錄: Path currentDir3 = Paths.get(".."); System.out.println("原始路徑格式:"+currentDir3.toAbsolutePath()); System.out.println("執行normalize()方法之后:"+currentDir3.toAbsolutePath().normalize()); System.out.println("執行toRealPath()方法之后:"+currentDir3.toRealPath());
結果:
C:UsersAdministratorNIODemo. 原始路徑格式:C:UsersAdministratorNIODemo.NIODemo.iml 執行normalize()方法之后:C:UsersAdministratorNIODemoNIODemo.iml 執行toRealPath()方法之后:C:UsersAdministratorNIODemoNIODemo.iml 原始路徑格式:C:UsersAdministratorNIODemo.. 執行normalize()方法之后:C:UsersAdministrator 執行toRealPath()方法之后:C:UsersAdministrator二 擁抱Files類
Java NIO中的Files類(java.nio.file.Files)提供了多種操作文件系統中文件的方法。本節教程將覆蓋大部分方法。Files類包含了很多方法,所以如果本文沒有提到的你也可以直接查詢JavaDoc文檔。
java.nio.file.Files類是和java.nio.file.Path相結合使用的
1 檢查給定的Path在文件系統中是否存在通過 Files.exists() 檢測文件路徑是否存在:
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()的的第二個參數。它是一個數組,這個參數直接影響到Files.exists()如何確定一個路徑是否存在。在本例中,這個數組內包含了LinkOptions.NOFOLLOW_LINKS,表示檢測時不包含符號鏈接文件。
2 創建文件/文件夾創建文件:
通過 Files.createFile() 創建文件,
Path target2 = Paths.get("C:mystuff.txt"); try { if(!Files.exists(target2)) Files.createFile(target2); } catch (IOException e) { e.printStackTrace(); }
創建文件夾:
通過 Files.createDirectory() 創建文件夾
通過 Files.createDirectories() 創建文件夾
Files.createDirectories()會首先創建所有不存在的父目錄來創建目錄,而Files.createDirectory()方法只是創建目錄,如果它的上級目錄不存在就會報錯。比如下面的程序使用Files.createDirectory() 方法創建就會報錯,這是因為我的D盤下沒有data文件夾,加入存在data文件夾的話則沒問題。
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 刪除文件或目錄
通過 Files.delete()方法 可以刪除一個文件或目錄:
Path path = Paths.get("data/subdir/logging-moved.properties"); try { Files.delete(path); } catch (IOException e) { //deleting file failed e.printStackTrace(); }4 把一個文件從一個地址復制到另一個位置
通過Files.copy()方法可以吧一個文件從一個地址復制到另一個位置
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操作還可可以強制覆蓋已經存在的目標文件,只需要將上面的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, "*"));
結果:
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 遍歷一個文件夾
Path dir = Paths.get("D:Java"); try(DirectoryStreamstream = Files.newDirectoryStream(dir)){ for(Path e : stream){ System.out.println(e.getFileName()); } }catch(IOException e){ }
結果:
apache-maven-3.5.0 Eclipse intellij idea Jar JDK MarvenRespository MyEclipse 2017 CI Nodejs RedisDesktopManager solr-7.2.1
上面是遍歷單個目錄,它不會遍歷整個目錄。遍歷整個目錄需要使用:Files.walkFileTree().Files.walkFileTree()方法具有遞歸遍歷目錄的功能。
7 遍歷整個文件目錄:walkFileTree接受一個Path和FileVisitor作為參數。Path對象是需要遍歷的目錄,FileVistor則會在每次遍歷中被調用。
FileVisitor需要調用方自行實現,然后作為參數傳入walkFileTree().FileVisitor的每個方法會在遍歷過程中被調用多次。如果不需要處理每個方法,那么可以繼承它的默認實現類SimpleFileVisitor,它將所有的接口做了空實現。
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; } } }
上面這個例子輸出了我的D:apache-tomcat-9.0.0.M17也就是我的Tomcat安裝目錄下以.java結尾文件的數量。
結果:
result.size()=4
Files類真的很強大,除了我講的這些操作之外還有其他很多操作比如:讀取和設置文件權限、更新文件所有者等等操作。
我這里就介紹這么多了,如果想要詳細了解的可以自行查閱官方文檔或者相關書籍。
官方JDK相關文檔
谷歌搜索排名第一的Java NIO教程
《Java程序員修煉之道》
《Java 8編程官方參考教程(第9版)》
Java7新特性之文件操作
歡迎關注我的微信公眾號:"Java面試通關手冊"(一個有溫度的微信公眾號,期待與你共同進步~~~堅持原創,分享美文,分享各種Java學習資源):
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69397.html
摘要:從通道進行數據寫入創建一個緩沖區,填充數據,并要求通道寫入數據。三之通道主要內容通道介紹通常來說中的所有都是從通道開始的。從中選擇選擇器維護注冊過的通道的集合,并且這種注冊關系都被封裝在當中停止選擇的方法方法和方法。 由于內容比較多,我下面放的一部分是我更新在我的微信公眾號上的鏈接,微信排版比較好看,更加利于閱讀。每一篇文章下面我都把文章的主要內容給列出來了,便于大家學習與回顧。 Ja...
摘要:會自動遍歷下的所有文件和目錄,并對其觸發中相應的方法,并使用方法的返回值來控制訪問器的后續行為。它的實例有繼續不訪問兄弟文件或目錄不訪問子文件或子目錄終止后續行為官網實例刪除所有子文件和子目錄是一個接口,定義了監聽目錄變化的方法。 簡介 java 7新增了如下API來訪問文件或者進行IO操作 Path - 接口,代表一個平臺無關的目錄。提供了大量的方法來操作目錄。 Paths - ...
摘要:解決中的容器文件不能持久的問題目前下使用的主流方式還是使用需要借用虛擬器啟動一個宿主機才能在上面啟動多個容器當我們在容器中運行服務時經常會有需要將服務數據持久化的場景比如運行集群時需要將索引數據持久保存到磁盤那具體保存到哪里呢容器的無狀態特 解決Docker Machine中的容器文件不能持久的問題 目前Mac下使用docker的主流方式還是使用Docker machine. Dock...
摘要:將參數的所有字節寫入輸出流兩個允許指定的新構造函數。四個允許指定的新構造函數。返回從此字符串中提取的行的流,由行終止符分隔。如上所述,使用指定的將字符編碼為字節。返回此表示的執行客戶端中的包裝原因,如果原因不存在或未知,則返回。 有關API更改的完整列表,可在Github上獲得。 這里列出的是除了java.net.http和jdk.jfr模塊之外的所有新方法。沒有列出java.secu...
閱讀 3781·2023-04-25 21:09
閱讀 3130·2021-10-20 13:48
閱讀 3027·2021-09-24 10:25
閱讀 2939·2021-08-21 14:08
閱讀 1796·2019-08-30 15:56
閱讀 983·2019-08-30 15:52
閱讀 1849·2019-08-29 14:11
閱讀 3569·2019-08-29 11:01