Java 7:使用NIO.2進行文件過濾–第3部分

大家好。 這是使用NIO.2系列進行文件過濾的第3部分。 對于那些尚未閱讀第1 部分或第2部分的人 ,這里有個回顧。

NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API,您可以執行與java.io相同的操作,以及許多出色的功能,例如:訪問文件元數據并查看用于目錄更改等。 顯然,由于向后兼容,java.io包不會消失,但是我們鼓勵為滿足新的I / O需求而開始使用NIO.2。 在本文中,我們將看到使用此API過濾目錄內容有多么容易。 為此,有3種方法,我們已經在第1 部分和第2 部分中回顧了兩種類似的方法,但是現在我們將看到一種更強大的方法。

你需要什么

NetBeans 7+或任何其他支持Java 7的IDE

JDK 7+

在某些應用程序中,過濾目錄的內容是一項常見的任務,而NIO.2使其變得非常簡單。 接下來將描述我們將要使用的類和接口:

  • java.nio.file.Path :接口,其對象可以表示文件系統中的文件或目錄。 就像java.io.File,但是在NIO.2中。 無論您要執行什么I / O操作,都需要該接口的實例。
  • java.nio.file.DirectoryStream :接口,其對象遍歷目錄的內容。
  • java.nio.file.DirectoryStream.filter <T> :一個嵌套接口,其對象決定是否應過濾目錄中的元素。
  • java.nio.file.Files :帶有對文件,目錄等進行操作的靜態方法的類。

我們用來過濾目錄內容的方法是使用實??現java.nio.file.DirectoryStream.filter <T>接口的對象。 此接口僅聲明一個方法+ accept(T):boolean ,正如JavaDoc所說:“如果應接受目錄條目,則返回true ”。 因此,取決于您要實現此方法,并根據您要使用的任何屬性來決定是否應接受目錄條目:隱藏,大小,所有者,創建日期等。記住這一點很重要,使用此方法方法,您不再局限于僅按名稱進行過濾,可以使用任何其他屬性。

如果只需要目錄,則可以在創建過濾器時使用java.nio.file.Files類及其+ isDirectory(Path,LinkOption…):boolean方法:

//in a class.../*** Creates a filter for directories only* @return Object which implements DirectoryStream.Filter* interface and that accepts directories only.*/public static DirectoryStream.Filter<Path> getDirectoriesFilter() {DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {@Overridepublic boolean accept(Path entry) throws IOException {return Files.isDirectory(entry);}};return filter;}

或者,如果只需要隱藏文件,則可以在創建過濾器時使用java.nio.file.Files類及其+ isHidden(Path):boolean方法:

//in a class.../*** Creates a filter for hidden files only* @return Object which implements DirectoryStream.Filter* interface and that accepts hidden files only.*/public static DirectoryStream.Filter<Path> getHiddenFilesFilter() {DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {@Overridepublic boolean accept(Path entry) throws IOException {return Files.isHidden(entry);}};return filter;}

或者,如果您希望文件屬于特定用戶,則必須要求一個用戶,并將其與目錄條目的所有者進行比較。 要獲取目錄條目的所有者,可以使用java.nio.file.Files類及其+ getOwner(Path,LinkOption…):UserPrincipal方法(注意,并非所有的OS都支持此方法)。

要獲取文件系統上的特定用戶,請使用java.nio.file.FileSystem類及其+ getUserPrincipalLookupService() :

//in a class.../*** Creates a filter for owners* @return Object which implements DirectoryStream.Filter* interface and that accepts files that belongs to the * owner passed as parameter.*/public static DirectoryStream.Filter<Path> getOwnersFilter(String ownerName) throws IOException{UserPrincipalLookupService lookup = FileSystems.getDefault().getUserPrincipalLookupService();final UserPrincipal me = lookup.lookupPrincipalByName(ownerName);DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {@Overridepublic boolean accept(Path entry) throws IOException {return Files.getOwner(entry).equals(me);}};return filter;}

以下代碼段定義了一種使用以前的任何過濾器掃描目錄的方法:

//in a class.../*** Scans the directory using the filter passed as parameter.* @param folder directory to scan* @param filter Object which decides whether a * directory entry should be accepted*/private static void scan(String folder, DirectoryStream.Filter<Path> filter) {//obtains the Images directory in the app directoryPath dir = Paths.get(folder);//the Files class offers methods for validationif (!Files.exists(dir) || !Files.isDirectory(dir)) {System.out.println('No such directory!');return;}//validate the filterif (filter == null) {System.out.println('Please provide a filter.');return;}//Try with resources... so nice!try (DirectoryStream<Path> ds = Files.newDirectoryStream(dir, filter)) {//iterate over the filtered content of the directory int count = 0;for (Path path : ds) {System.out.println(path.getFileName());count++;}System.out.println();System.out.printf('%d entries were accepted\n', count);} catch (IOException ex) {ex.printStackTrace();}}

我們可以通過將以下參數傳遞給main方法來執行前面的代碼(請查看本文結尾處的源代碼):

  • 要掃描的目錄:C:\或/取決于您的操作系統。
  • 篩選條件:隱藏

執行代碼時,我們得到以下信息:

在Windows計算機中,可以使用以下命令獲取隱藏文件:
dir / AAH注意,我們得到的結果相同:

在我的Linux虛擬機上:

使用命令
ls -ald。*我們得到類似的結果:

再一次,寫一次,到處運行!

希望您喜歡使用NIO.2系列進行文件過濾。 最后一點,我們回顧的所有過濾方法僅適用于一個目錄,如果要掃描完整的目錄樹,則必須使用
java.nio.file.SimpleFileVisitor類。 單擊此處下載此帖子的源代碼。

參考: Java 7:使用NIO.2進行文件過濾–來自Java和ME博客的JCG合作伙伴 Alexis Lopez (第3部分) 。

翻譯自: https://www.javacodegeeks.com/2012/11/java-7-file-filtering-using-nio-2-part-3.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370276.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370276.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370276.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python眾數問題給定含有n個元素的多重集合s_分治法求眾數 給定含有n個元素的多重集合S 聯合開發網 - pudn.com...

分治法求眾數所屬分類&#xff1a;數據結構開發工具&#xff1a;C/C文件大小&#xff1a;240KB下載次數&#xff1a;3上傳日期&#xff1a;2018-01-04 20:19:09上 傳 者&#xff1a;九鼎說明&#xff1a; 給定含有n個元素的多重集合S&#xff0c;每個元素在S中出現的次數稱為該…

mysql 5.0 亂碼,解決MySQL 5.0.16的亂碼問題

導讀&#xff1a;問&#xff1a;怎樣解決MySQL 5.0.16的亂碼問題?答&#xff1a;MySQL 5.0.16的亂碼問題可以用下面的方法解決&#xff1a;1.設置phpMyAdminLanguage:Chinese simplified (zh-utf-8)MySQL 字符集&#xff1a;UTF-8 Unicode (utf8)MySQL 連接校對 gbk_chinese_c…

Hadoop Serialization -- hadoop序列化具體解釋 (2)【Text,BytesWritable,NullWritable】

回想&#xff1a;回想序列化&#xff0c;事實上原書的結構非常清晰&#xff0c;我截圖給出書中的章節結構&#xff1a;序列化最基本的&#xff0c;最底層的是實現writable接口&#xff0c;wiritable規定讀和寫的游戲規則 &#xff08;void write(DataOutput out) throws IOExce…

我需要多少個線程?

這取決于您的應用程序。 但是對于那些希望對如何從生產站點購買的所有昂貴內核中擠出更多資金的人來說&#xff0c;請多多包涵&#xff0c;我將闡明圍繞多線程 Java應用程序的奧秘。 內容針對最典型的Java EE應用程序進行了“優化”&#xff0c;該應用程序具有Web前端&#xff…

H5網頁適配 iPhoneX,就是這么簡單

iPhoneX 取消了物理按鍵&#xff0c;改成底部小黑條&#xff0c;這一改動導致網頁出現了比較尷尬的屏幕適配問題。對于網頁而言&#xff0c;頂部&#xff08;劉海部位&#xff09;的適配問題瀏覽器已經做了處理&#xff0c;所以我們只需要關注底部與小黑條的適配問題即可&#…

python為什么closed_為什么python類的函數被調用兩次[關閉](Why a function of python class is called twice [closed])...

為什么python類的函數被調用兩次[關閉](Why a function of python class is called twice [closed])我遇到了兩次調用的python類函數的問題。 我正在使用Spyder IDE。這是我的簡單代碼class Test:def f(self):print("a")from Test import *t Test()t.f()當我按“運行…

php關聯數組和哈希表,php遍歷哈希表及關聯數組的實例代碼

有關php數組的分類&#xff0c;PHP數組分為&#xff1a;數字索引數組和關聯數組。其中數字索引數組和C語言中的數組一樣&#xff0c;下標是為0&#xff0c;1&#xff0c;2…而關聯數組下標可能是任意類型&#xff0c;與其它語言中的hash&#xff0c;map等結構相似。PHP遍歷關聯…

數字校園-云資源平臺 2014.10.26-人人通共享空間

近期,教育部在統計學校信息化建設情況,當中一項重要內容,作為三通兩平臺的一個環節,就是學校開通人人通空間的情況,網上普及了一下知識,不就是十多年前就玩的學校博客的變種嗎,網上有一些產品,也是沒有熱鬧起來,為要求而要求的多,既然要求,就來一個吧,花了幾天時間,也做了一個.…

VUE.js 中取得后臺原生HTML字符串 原樣顯示問題

今天使用vue調試頁面&#xff0c;發現了頁面上的一個問題&#xff0c;后臺數據傳過來的HTML字符串并沒有被轉換為正常的HTML代碼&#xff0c;一拍腦門&#xff0c;發現忘記轉換了&#xff0c;于是滿心歡喜加上了{{{}}}。但是之后構建發現報錯&#xff1a; 為此去官網上查了下…

高性能持久消息

總覽 盡管有許多可用于Java的高性能消息傳遞系統&#xff0c;但大多數都避免引用基準&#xff0c;包括持久消息傳遞和消息的序列化/反序列化。 這樣做有很多原因。 1&#xff09;您并不總是需要或想要持久消息2&#xff09;您希望使用自己的序列化選項。 避免使用它們的一個重要…

python去掉重復內容并按原來次序輸出元素_在Python中,從列表中刪除重復項以使所有元素在保留順序時都是唯一的最快的算法是什么?...

飲歌長嘯使用方法&#xff1a;lst [8, 8, 9, 9, 7, 15, 15, 2, 20, 13, 2, 24, 6, 11, 7, 12, 4, 10, 18, 13, 23, 11, 3, 11, 12, 10, 4, 5, 4, 22, 6, 3, 19, 14, 21, 11, 1, 5, 14, 8, 0, 1, 16, 5, 10, 13, 17, 1, 16, 17, 12, 6, 10, 0, 3, 9, 9, 3, 7, 7, 6, 6, 7, 5, 1…

Lucene –快速添加索引和搜索功能

什么是Lucene&#xff1f; Apache LuceneTM是完全用Java編寫的高性能&#xff0c;功能齊全的文本搜索引擎庫。 它是一項適用于幾乎所有需要全文搜索的應用程序的技術&#xff0c;尤其是跨平臺的應用程序。 Lucene可以純文本&#xff0c;整數&#xff0c;索引PDF&#xff0c;Of…

td 雙擊 編輯 php,雙擊表格td進行編輯

$(function(){//隔行換色// $("tbody tr:odd").css("background-color","#eee");var numId $(".tbody td");numId.dblclick(function(){var tdIns $(this);var tdpar $(this).parents("tr");//tdpar.remove();//current_…

前端開發之基礎知識-HTML(一)

1.1 html概述和基本結構 html概述 HTML是 HyperText Mark-up Language 的首字母簡寫&#xff0c;意思是超文本標記語言&#xff0c;超文本指的是超鏈接&#xff0c;標記指的是標簽&#xff0c;是一種用來制作網頁的語言&#xff0c;這種語言由一個個的標簽組成&#xff0c;用…

nodejs的async異步編程

函數有&#xff1a; series waterfall parallel parallelLimit … series函數 串行執行 它的作用就是按照順序一次執行。 async.series({ one: function(callback){ callback(null, 1); }, two: function(callback){ callback(null, 2); } },function(err, results) { conso…

《深入理解Java虛擬機》讀書筆記3--垃圾回收算法

轉載&#xff1a;http://blog.csdn.net/tjiyu/article/details/53983064 下面先來了解Java虛擬機垃圾回收的幾種常見算法&#xff1a;標記-清除算法、復制算法、標記-整理算法、分代收集算法、火車算法&#xff0c;介紹它們的算法思路&#xff0c;有什么優點和缺點&#xff0c;…

python常用函數中文_【python】python常用函數

urlencode與urldecode當url中包含中文或者參數包含中文&#xff0c;需要對中文或者特殊字符(/、&)做編碼轉換。urlencode的本質&#xff1a;把字符串轉為gbk編碼&#xff0c;再把\x替換成%。如果終端是utf8編碼的&#xff0c;需要把結果再轉成utf8輸出&#xff0c;否則會亂…

帶有批注的Spring硒測試

這篇文章描述了如何在Java中實現Selenium測試。 它的靈感來自Alex Collins的帖子&#xff0c;并帶有注釋。 該代碼可在GitHub的Spring-Selenium-Test目錄中找到。 一些替代方法和更輕巧的技術可用于對Spring MVC應用程序進行單元測試。 要進行單元測試服務&#xff0c;請參見此…

sizeof運算符

sizeof是一個單目運算符&#xff0c;它的運算對象是變量或數據類型&#xff0c;運算結果為一個整數。運算的一般形式如下: sizeof(<類型或變量名>) 它只針對數據類型&#xff0c;而不針對變量&#xff01; 若運算對象為變量&#xff0c;則所求的結果是這個變量占用的內存…

oracle 日志切換太頻繁,診斷一次Oracle日志切換頻繁的問題

日志切換&#xff0c;就是生成的日志太大&#xff0c;數據塊的變化太頻繁。Snap IdSnap TimeSessionsCursors/SessionBegin Snap:1456009-Dec-15 04:00:48594.5End Snap:1456109-Dec-15 05:00:59544.6Elapsed:60.19 (mins)DB Time:82.47 (mins)1s產生2M的日志。Per SecondPer T…