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

資訊專欄INFORMATION COLUMN

JAVA NIO.2

TerryCai / 1426人閱讀

摘要:會(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)聽(tīng)目錄變化的方法。

簡(jiǎn)介

java 7新增了如下API來(lái)訪問(wèn)文件或者進(jìn)行IO操作

Path - 接口,代表一個(gè)平臺(tái)無(wú)關(guān)的目錄。提供了大量的方法來(lái)操作目錄。

Paths - 工具類。所有方法都是static的。

Files - 操作文件的工具類。提供了大量的方法來(lái)操作文件。該類所包含的大量方法可能與我們?nèi)粘R话愕钠谕行┏鋈搿?/p>

提供以Asynchronous開(kāi)頭的Channel類和接口,因此這部分也可以稱為AIO(異步IO)
早期的Java只提供了File類來(lái)訪問(wèn)文件,其功能有限且性能不高,NIO.2提供了Path接口以及Paths和Files工具類來(lái)訪問(wèn)文件系統(tǒng)。

JAVA AIO

Path、Paths、FileSystems、FileSystem、FileStore、FileStoreAttributeView

java.nio.file.Paths 包含了用于創(chuàng)建Path對(duì)象的靜態(tài)方法
java.nio.file.Path 包含了大量用于操縱文件路徑的方法
java.nio.file.FileSystems 用于訪問(wèn)文件系統(tǒng)的類
java.nio.file.FileSystem 代表了一種文件系統(tǒng),例如Unix下的根目錄為 / ,而Windows下則為C盤
java.nio.file.FileStore 代表了真正的存儲(chǔ)設(shè)備,提供了設(shè)備的詳盡信息
java.nio.file.attribute.FileStoreAttributeView 提供了訪問(wèn)文件的信息

Path和Paths

代表一個(gè)與平臺(tái)無(wú)關(guān)的路徑。Path是NIO操作的基礎(chǔ),我們可以定義一個(gè)文件路徑,對(duì)路徑的相關(guān)操作等。

//得到當(dāng)前目錄Path
Path path = Paths.get(".");
//獲取絕對(duì)路徑
Path absulutePath=path.toAbsolutePath();

//得到g:datamoney
Path path = Paths.get("g:","data","money");
  
Files

提供對(duì)文件的各種操作的方法

Path path=Paths.get("xxxxxxxx");
//復(fù)制文件
Files.copy( path, OutPutStream out);

//判斷是否為隱藏文件
boolean isHidden=Files.isHidden(path);

//獲取文件大小
long size=Files.size(path);

//寫入文件
List list=new ArrayList<>();
Files.write(path, list,Charset.forName("utf-8"));

//操作子目錄和子文件
Files.list(path).forEach(path->System.out.println(path));

//等等。。。。。
FileVisitor

在舊版本中遍歷文件系統(tǒng)只能通過(guò)遞歸的方法來(lái)實(shí)現(xiàn),但是這種方法不僅消耗資源大而且效率低;

NIO.2的Files工具類提供了一個(gè)靜態(tài)工具方法walkFileTree來(lái)高效并優(yōu)雅地遍歷文件系統(tǒng).

walkFileTree(Path start,FileVisitor visitor);
walkFileTree(Path start,Setoptions,int maxDepth,FileVisitor visitor);

FileVisitor就是一個(gè)對(duì)文件進(jìn)行操作的文件訪問(wèn)器,它是一個(gè)借口,JAVA提供了具體實(shí)現(xiàn)類,如SimpleFileVisitor。walkFileTree會(huì)自動(dòng)遍歷start下的所有文件和目錄,并對(duì)其觸發(fā)FileVisitor中相應(yīng)的方法,并使用方法的返回值FileVisitResult來(lái)控制訪問(wèn)器的后續(xù)行為。

//Invoked for a directory after entries in the directory, and all of their descendants, have been visited.
訪問(wèn)該目錄及其所有與子文件、子目錄后觸發(fā)
FileVisitResult    postVisitDirectory(T dir, IOException exc)

//Invoked for a directory before entries in the directory are visited.
訪問(wèn)目錄前觸發(fā)
FileVisitResult    preVisitDirectory(T dir, BasicFileAttributes attrs)

//Invoked for a file in a directory.訪問(wèn)文件前觸發(fā)
FileVisitResult    visitFile(T file, BasicFileAttributes attrs)

//Invoked for a file that could not be visited.
FileVisitResult    visitFileFailed(T file, IOException exc)

//FileVisitResult是一個(gè)枚舉類型。它的實(shí)例有:
1. CONTINUE   //Continue.繼續(xù)
2. SKIP_SIBLINGS //Continue without visiting the siblings of this file or directory.不訪問(wèn)兄弟文件或目錄
3. SKIP_SUBTREE  //Continue without visiting the entries in this directory.//不訪問(wèn)子文件或子目錄
4. TERMINATE //Terminate.//終止后續(xù)行為

官網(wǎng)實(shí)例:刪除所有子文件和子目錄

 Path start = ...
 Files.walkFileTree(start, new SimpleFileVisitor() {
         @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

WatchService是一個(gè)接口,定義了監(jiān)聽(tīng)目錄變化的方法。

一般來(lái)說(shuō),我們要監(jiān)聽(tīng)某個(gè)目錄的變化(如文件/目錄的創(chuàng)建、修改、刪除等),會(huì)設(shè)置一個(gè)定時(shí)任務(wù)(如線程),每隔一分鐘讀取下指定目錄下的文件變化。這種方式很繁瑣,而且效率低,效率都消耗在了遍歷、保存狀態(tài)、對(duì)比狀態(tài)上了! 而且無(wú)法利用OS的很多功能。

OS自己的文件系統(tǒng)監(jiān)控器可以監(jiān)控系統(tǒng)上所有文件的變化,這種監(jiān)控是無(wú)需遍歷、無(wú)需比較的,是一種基于信號(hào)收發(fā)的監(jiān)控,因此效率一定是最高的;現(xiàn)在Java對(duì)其進(jìn)行了包裝,可以直接在Java程序中使用OS的文件系統(tǒng)監(jiān)控器了。

獲取監(jiān)聽(tīng)器:WatchService watcher = FileSystems.getDefault().newWatchService();

注冊(cè)監(jiān)聽(tīng)器:
Paths.get("path").register(watchService,StandardWatchEventKinds eventKinds);

WatchService可以監(jiān)控文件的變動(dòng)信息(監(jiān)控到文件是修改,新增、刪除等事件;)
其中注冊(cè)事件有的:
StandardWatchEventKinds.ENTRY_MODIFY,//更新
StandardWatchEventKinds.ENTRY_DELETE,//創(chuàng)建
StandardWatchEventKinds.ENTRY_CREATE,//刪除

監(jiān)聽(tīng)器的方法(關(guān)閉、獲取事件通知):
1. void    close() //關(guān)閉監(jiān)聽(tīng)器
Closes this watch service.
2. WatchKey    poll() //獲取下一個(gè)WatchKey,如果沒(méi)有則返回null
Retrieves and removes the next watch key, or null if none are present.
3. WatchKey    poll(long timeout, TimeUnit unit) //嘗試等待一段時(shí)間,獲取下一個(gè)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()  //如果沒(méi)有WatchKey就一直等待
Retrieves and removes next watch key, waiting if none are yet present.

實(shí)例:

WatchService watcher = FileSystems.getDefault().newWatchService();
Paths.get("path").register(watchService,StandardWatchEventKinds StandardWatchEventKinds.ENTRY_DELETE);//監(jiān)聽(tīng)子文件或子目錄的創(chuàng)建事件

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實(shí)時(shí)監(jiān)控某個(gè)目錄下的文件變化并按行解析

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

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

相關(guān)文章

  • java-netty-Netty in Action 5th-ch1-Netty and Java

    摘要:一個(gè)多路復(fù)用器可以負(fù)責(zé)成千上萬(wàn)的通道,沒(méi)有上限。不需要通過(guò)對(duì)多路復(fù)用器對(duì)注冊(cè)的通道進(jìn)行輪詢操作即可實(shí)現(xiàn)異步讀寫,從而簡(jiǎn)化編程模型。同時(shí),支持支持如果是怎么辦最后,到目前位置,支持不支持二無(wú)法擴(kuò)展作為的核心,無(wú)法擴(kuò)展,私有構(gòu)造函數(shù)。 前言 netty 學(xué)習(xí) 基于 netty in action 5th, 官網(wǎng)資料,網(wǎng)絡(luò)博客等 1.1 Why Netty? netty 是一個(gè)中間層的抽象 ...

    LeviDing 評(píng)論0 收藏0
  • Java NIO

    摘要:緩沖區(qū)的容量不可能為負(fù)值,創(chuàng)建后不能改變界限界限第一個(gè)不應(yīng)該被讀寫或者寫入的緩沖區(qū)位置索引。當(dāng)使用從中讀取數(shù)據(jù)時(shí),的值恰好等于已經(jīng)讀到了多少數(shù)據(jù)。 NIO:New IO Java新IO概述 新IO采用內(nèi)存映射文件的方式來(lái)處理輸入/輸出,新IO文件或文件的一段區(qū)域映射到內(nèi)存中,這樣就可以訪問(wèn)內(nèi)存一樣來(lái)訪問(wèn)文件了(這種方式模擬了操作系統(tǒng)上的虛擬內(nèi)存的概念),通過(guò)這種方式來(lái)進(jìn)行輸入/輸出比傳...

    Steve_Wang_ 評(píng)論0 收藏0
  • 一文理解:Java NIO 核心組件

    摘要:的出現(xiàn)解決了這尷尬的問(wèn)題,非阻塞模式下,通過(guò),我們的線程只為已就緒的通道工作,不用盲目的重試了。注意要將注冊(cè)到,首先需要將設(shè)置為非阻塞模式,否則會(huì)拋異常。 showImg(https://segmentfault.com/img/remote/1460000017053374); 背景知識(shí) 同步、異步、阻塞、非阻塞 首先,這幾個(gè)概念非常容易搞混淆,但NIO中又有涉及,所以總結(jié)一下。 ...

    Coding01 評(píng)論0 收藏0
  • 一文讓你徹底理解 Java NIO 核心組件

    摘要:的出現(xiàn)解決了這尷尬的問(wèn)題,非阻塞模式下,通過(guò),我們的線程只為已就緒的通道工作,不用盲目的重試了。注意要將注冊(cè)到,首先需要將設(shè)置為非阻塞模式,否則會(huì)拋異常。 同步、異步、阻塞、非阻塞首先,這幾個(gè)概念非常容易搞混淆,但NIO中又有涉及,所以總結(jié)一下[1]。 同步:API調(diào)用返回時(shí)調(diào)用者就知道操作的結(jié)果如何了(實(shí)際讀取/寫入了多少字節(jié))。 異步:相對(duì)于同步,API調(diào)用返回時(shí)調(diào)用者不知道操作...

    guyan0319 評(píng)論0 收藏0
  • Linux I/O model 和 JAVA NIO/AIO

    摘要:之后推出的是,是面向緩沖區(qū)的,數(shù)據(jù)讀取到一個(gè)它稍后處理的緩沖區(qū),需要時(shí)可在緩沖區(qū)中前后移動(dòng)。之后的又引入了,對(duì)應(yīng)的可以實(shí)現(xiàn)模式。該接口常被用于高效的網(wǎng)絡(luò)文件的數(shù)據(jù)傳輸和大文件拷貝。進(jìn)階五模型從到和模式 Linux I/O model blocking I/O non blocking I/O I/O multiplexing (select and poll) signal driv...

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

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

0條評(píng)論

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