摘要:會自動遍歷下的所有文件和目錄,并對其觸發中相應的方法,并使用方法的返回值來控制訪問器的后續行為。它的實例有繼續不訪問兄弟文件或目錄不訪問子文件或子目錄終止后續行為官網實例刪除所有子文件和子目錄是一個接口,定義了監聽目錄變化的方法。
簡介
java 7新增了如下API來訪問文件或者進行IO操作
Path - 接口,代表一個平臺無關的目錄。提供了大量的方法來操作目錄。
Paths - 工具類。所有方法都是static的。
Files - 操作文件的工具類。提供了大量的方法來操作文件。該類所包含的大量方法可能與我們日常一般的期望有些出入。
提供以Asynchronous開頭的Channel類和接口,因此這部分也可以稱為AIO(異步IO)
早期的Java只提供了File類來訪問文件,其功能有限且性能不高,NIO.2提供了Path接口以及Paths和Files工具類來訪問文件系統。
JAVA AIO
Path、Paths、FileSystems、FileSystem、FileStore、FileStoreAttributeViewPath和Pathsjava.nio.file.Paths 包含了用于創建Path對象的靜態方法
java.nio.file.Path 包含了大量用于操縱文件路徑的方法
java.nio.file.FileSystems 用于訪問文件系統的類
java.nio.file.FileSystem 代表了一種文件系統,例如Unix下的根目錄為 / ,而Windows下則為C盤
java.nio.file.FileStore 代表了真正的存儲設備,提供了設備的詳盡信息
java.nio.file.attribute.FileStoreAttributeView 提供了訪問文件的信息
代表一個與平臺無關的路徑。Path是NIO操作的基礎,我們可以定義一個文件路徑,對路徑的相關操作等。
//得到當前目錄Path Path path = Paths.get("."); //獲取絕對路徑 Path absulutePath=path.toAbsolutePath(); //得到g:datamoney Path path = Paths.get("g:","data","money");Files
提供對文件的各種操作的方法
Path path=Paths.get("xxxxxxxx"); //復制文件 Files.copy( path, OutPutStream out); //判斷是否為隱藏文件 boolean isHidden=Files.isHidden(path); //獲取文件大小 long size=Files.size(path); //寫入文件 ListFileVisitorlist=new ArrayList<>(); Files.write(path, list,Charset.forName("utf-8")); //操作子目錄和子文件 Files.list(path).forEach(path->System.out.println(path)); //等等。。。。。
在舊版本中遍歷文件系統只能通過遞歸的方法來實現,但是這種方法不僅消耗資源大而且效率低;
NIO.2的Files工具類提供了一個靜態工具方法walkFileTree來高效并優雅地遍歷文件系統.
walkFileTree(Path start,FileVisitor super Path> visitor); walkFileTree(Path start,Setoptions,int maxDepth,FileVisitor super Path> visitor);
FileVisitor就是一個對文件進行操作的文件訪問器,它是一個借口,JAVA提供了具體實現類,如SimpleFileVisitor。walkFileTree會自動遍歷start下的所有文件和目錄,并對其觸發FileVisitor中相應的方法,并使用方法的返回值FileVisitResult來控制訪問器的后續行為。
//Invoked for a directory after entries in the directory, and all of their descendants, have been visited. 訪問該目錄及其所有與子文件、子目錄后觸發 FileVisitResult postVisitDirectory(T dir, IOException exc) //Invoked for a directory before entries in the directory are visited. 訪問目錄前觸發 FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs) //Invoked for a file in a directory.訪問文件前觸發 FileVisitResult visitFile(T file, BasicFileAttributes attrs) //Invoked for a file that could not be visited. FileVisitResult visitFileFailed(T file, IOException exc) //FileVisitResult是一個枚舉類型。它的實例有: 1. CONTINUE //Continue.繼續 2. SKIP_SIBLINGS //Continue without visiting the siblings of this file or directory.不訪問兄弟文件或目錄 3. SKIP_SUBTREE //Continue without visiting the entries in this directory.//不訪問子文件或子目錄 4. TERMINATE //Terminate.//終止后續行為
官網實例:刪除所有子文件和子目錄
Path start = ... Files.walkFileTree(start, new SimpleFileVisitorWatchService() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Files.delete(file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException e) throws IOException { if (e == null) { Files.delete(dir); return FileVisitResult.CONTINUE; } else { // directory iteration failed throw e; } } });
WatchService是一個接口,定義了監聽目錄變化的方法。
一般來說,我們要監聽某個目錄的變化(如文件/目錄的創建、修改、刪除等),會設置一個定時任務(如線程),每隔一分鐘讀取下指定目錄下的文件變化。這種方式很繁瑣,而且效率低,效率都消耗在了遍歷、保存狀態、對比狀態上了! 而且無法利用OS的很多功能。
OS自己的文件系統監控器可以監控系統上所有文件的變化,這種監控是無需遍歷、無需比較的,是一種基于信號收發的監控,因此效率一定是最高的;現在Java對其進行了包裝,可以直接在Java程序中使用OS的文件系統監控器了。
獲取監聽器:WatchService watcher = FileSystems.getDefault().newWatchService();
注冊監聽器: Paths.get("path").register(watchService,StandardWatchEventKinds eventKinds); WatchService可以監控文件的變動信息(監控到文件是修改,新增、刪除等事件;) 其中注冊事件有的: StandardWatchEventKinds.ENTRY_MODIFY,//更新 StandardWatchEventKinds.ENTRY_DELETE,//創建 StandardWatchEventKinds.ENTRY_CREATE,//刪除 監聽器的方法(關閉、獲取事件通知): 1. void close() //關閉監聽器 Closes this watch service. 2. WatchKey poll() //獲取下一個WatchKey,如果沒有則返回null Retrieves and removes the next watch key, or null if none are present. 3. WatchKey poll(long timeout, TimeUnit unit) //嘗試等待一段時間,獲取下一個WatchKey Retrieves and removes the next watch key, waiting if necessary up to the specified wait time if none are yet present. 4. WatchKey take() //如果沒有WatchKey就一直等待 Retrieves and removes next watch key, waiting if none are yet present.
實例:
WatchService watcher = FileSystems.getDefault().newWatchService(); Paths.get("path").register(watchService,StandardWatchEventKinds StandardWatchEventKinds.ENTRY_DELETE);//監聽子文件或子目錄的創建事件 while(true){ WatchKey key = watcher.take(); for (WatchEvent> event: key.pollEvents()) { System.out.println(event.context() + " comes to " + event.kind()); } boolean valid = key.reset(); if (!valid) { break; } }
reference:
流與文件NIO.2
java利用WatchService實時監控某個目錄下的文件變化并按行解析
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67908.html
摘要:一個多路復用器可以負責成千上萬的通道,沒有上限。不需要通過對多路復用器對注冊的通道進行輪詢操作即可實現異步讀寫,從而簡化編程模型。同時,支持支持如果是怎么辦最后,到目前位置,支持不支持二無法擴展作為的核心,無法擴展,私有構造函數。 前言 netty 學習 基于 netty in action 5th, 官網資料,網絡博客等 1.1 Why Netty? netty 是一個中間層的抽象 ...
摘要:緩沖區的容量不可能為負值,創建后不能改變界限界限第一個不應該被讀寫或者寫入的緩沖區位置索引。當使用從中讀取數據時,的值恰好等于已經讀到了多少數據。 NIO:New IO Java新IO概述 新IO采用內存映射文件的方式來處理輸入/輸出,新IO文件或文件的一段區域映射到內存中,這樣就可以訪問內存一樣來訪問文件了(這種方式模擬了操作系統上的虛擬內存的概念),通過這種方式來進行輸入/輸出比傳...
摘要:的出現解決了這尷尬的問題,非阻塞模式下,通過,我們的線程只為已就緒的通道工作,不用盲目的重試了。注意要將注冊到,首先需要將設置為非阻塞模式,否則會拋異常。 showImg(https://segmentfault.com/img/remote/1460000017053374); 背景知識 同步、異步、阻塞、非阻塞 首先,這幾個概念非常容易搞混淆,但NIO中又有涉及,所以總結一下。 ...
摘要:的出現解決了這尷尬的問題,非阻塞模式下,通過,我們的線程只為已就緒的通道工作,不用盲目的重試了。注意要將注冊到,首先需要將設置為非阻塞模式,否則會拋異常。 同步、異步、阻塞、非阻塞首先,這幾個概念非常容易搞混淆,但NIO中又有涉及,所以總結一下[1]。 同步:API調用返回時調用者就知道操作的結果如何了(實際讀取/寫入了多少字節)。 異步:相對于同步,API調用返回時調用者不知道操作...
摘要:之后推出的是,是面向緩沖區的,數據讀取到一個它稍后處理的緩沖區,需要時可在緩沖區中前后移動。之后的又引入了,對應的可以實現模式。該接口常被用于高效的網絡文件的數據傳輸和大文件拷貝。進階五模型從到和模式 Linux I/O model blocking I/O non blocking I/O I/O multiplexing (select and poll) signal driv...
閱讀 644·2023-04-25 15:49
閱讀 3099·2021-09-22 15:13
閱讀 1237·2021-09-07 10:13
閱讀 3467·2019-08-29 18:34
閱讀 2556·2019-08-29 15:22
閱讀 499·2019-08-27 10:52
閱讀 677·2019-08-26 18:27
閱讀 3009·2019-08-26 13:44