在NIO.2中创建文件和目录
如今,大量的應用程序創建文件或目錄的目的非常廣泛。 無論是生成報告,導出配置文件還是僅存儲一些數據,能夠處理這些任務都非常重要。 創建文件和目錄是使用文件系統時最常用的功能之一。 圖書館的這一部分進行了相當現代化。 這方面的更新包括保證某些操作的原子性,使用預設文件屬性創建文件和目錄,性能優化以及引入異常層次結構,這些層次結構取代了IO庫先前版本中的boolean返回方法。
檢查方法
在深入探討任何代碼或解釋之前,讓我退后一步,集中討論一些不僅對本帖子至關重要,而且對以后的帖子也很重要的事情。 我發現熟悉一些通常稱為檢查方法的方法很重要。 檢查方法包括所有用于在調用實際文件系統操作代碼之前執行各種檢查的方法。 為了方便起見,它們都在類java.nio.file.Files 。 使用這些方法將幫助您防止應用程序發生意外行為。 由于這些方法非常簡單,因此我將跳過專用于它們的示例,而在以后的示例中使用它們。
| exists(Path path, LinkOption... options) | 測試文件是否存在。 |
| isExecutable(Path path) | 測試文件是否可執行。 |
| isHidden(Path path) | 告訴文件是否被視為隱藏文件。 |
| isReadable(Path path) | 測試文件是否可讀。 |
| isRegularFile(Path path, LinkOption... options) | 測試文件是否是具有不透明內容的常規文件。 |
| isSameFile(Path path, Path path2) | 測試兩個路徑是否找到同一文件。 |
| isWritable(Path path) | 測試文件是否可寫。 |
| notExists(Path path, LinkOption... options) | 測試通過此路徑定位的文件是否不存在。 |
創建一個新目錄
類Files的最重要用途之一是使用createDirectory方法創建新目錄。 目錄創建是非常簡單和直接的過程,因此無需太多解釋。 像往常一樣,它總是使用檢查方法是個好主意exists的類Files ,以確保它可以創建與給定路徑的目錄,同時防止FileAlreadyExistsException 。 下列代碼段展示了整個情況:
Path newDirectoryPath = Paths.get("/home/jstas/directory");if (!Files.exists(newDirectoryPath)) {try {Files.createDirectory(newDirectoryPath);} catch (IOException e) {System.err.println(e);} }該代碼示例非常簡單–在沒有其他文件系統條目駐留在提供的路徑上的情況下,它使用提供的路徑創建目錄。 如果需要創建整個目錄層次結構,則需要切換到createDirectories方法,該方法的行為類似,并創建由路徑實例定義的整個層次結構。 由于目錄是文件的一種,因此我們可以設置其自己的元數據( 文件屬性 )。 我們不僅能夠做到這一點,甚至可以預先創建元數據定義,并在原子操作中創建具有初始文件屬性的目錄,以防止沿途出現任何不一致之處。 如前一篇文章所述,管理文件系統權限有兩種受支持的標準:POSIX和ACL。
POSIX文件權限
首先,讓我們看一下如何在與POSIX兼容的系統(如基于Linux的系統和Mac OS)上管理文件系統權限。 由于POSIX文件權限非常容易理解,庫創建者為我們提供了便捷的工具,例如從字符串表示形式直接轉換為一組PosixFilePermission或將其轉換為FileAttribute對象的轉換工具。 這不是創建FileAttribute對象的唯一方法,我們將在下一章中看到。
回到前面的示例,讓我們看下面的代碼。 使用PosixFilePermissions類的便捷方法fromString ,我們可以創建一組PosixFilePermission 。 現在,需要創建FileAttribute實例,該實例將傳遞給createDirectory測試目錄的createDirectory方法。 讓我們看下面的代碼片段:
Path newDirectoryPath = Paths.get("/home/jstas/testPosix");if (!Files.exists(newDirectoryPath)) {Set<PosixFilePermission> permissions = PosixFilePermissions.fromString("r-xr-----");FileAttribute<Set<PosixFilePermission>> fileAttributes = PosixFilePermissions.asFileAttribute(permissions);try {Files.createDirectory(newDirectoryPath, fileAttributes);} catch (IOException e) {System.err.println(e);} }很容易驗證我們的權限設置是否正確。 您可以直接從Java代碼讀取文件屬性,如我在文件屬性文章中介紹的那樣,也可以手動執行。 我使用系統終端通過以下輸出檢查它們:
dr-xr-----. 2 jstas jstas 4096 Jan 5 13:34 testPosixACL文件權限
在ACL兼容系統(例如Windows(NT,2000,XP和更高版本))上管理文件系統權限時,事情變得有些復雜。 ACL列表會變得非常復雜和健壯,因此這里沒有POSIX文件權限之類的快捷方式。 此處的關鍵是使用基于接口FileAttribute的匿名類定義。 該接口僅定義兩種方法: name返回文件屬性的名稱, value返回此屬性的值。 使用ACL時,我們感興趣的屬性名稱為'acl:acl' 。 value方法僅返回構造的ACL條目的列表。
讓我們看一下ACL條目內隱藏的內容以及如何創建AclEntry實例。 首先,ACL條目包含幾個對象:
- 標志
- 標志組件是一組標志,用于指示條目如何被繼承和傳播
- 權限
- 權限組件是一組權限
- 類型
- 類型組件確定該條目是授予還是拒絕訪問。
- 主要
- 主體組件(有時稱為“誰”組件)是與條目授予或拒絕訪問的身份相對應的UserPrincipal
考慮到單個ACL條目的復雜性,NIO.2庫的創建者看到了一個非常合適的實現構建器模式的候選人。 請訪問以下頁面,以獲取有關設計模式和構建器模式的更多信息。 因此,實現選擇適當的標志和權限,將其與用戶主體綁定,并設置條目的類型。 請研究以下代碼片段以熟悉ACL權限:
Path newDirectoryPath = Paths.get("c:", "testACL");if (!Files.exists(newDirectoryPath)) {FileAttribute<List<AclEntry>> fileAttributes = new FileAttribute<List<AclEntry>>() {@Overridepublic List<AclEntry> value() {// lookup user principalFileSystem fileSystem = FileSystems.getDefault();UserPrincipalLookupService userPrincipalLookupService = fileSystem.getUserPrincipalLookupService();UserPrincipal userPrincipal = null;try {userPrincipal = userPrincipalLookupService.lookupPrincipalByName("JStas");} catch (IOException e) {throw new RuntimeException(e);}// select ACL flagsSet<AclEntryFlag> flags = EnumSet.of(AclEntryFlag.FILE_INHERIT, AclEntryFlag.DIRECTORY_INHERIT);// select ACL permissionSet<AclEntryPermission> permissions = EnumSet.of(AclEntryPermission.READ_DATA, AclEntryPermission.WRITE_DATA, AclEntryPermission.EXECUTE);// build ACL entryBuilder builder = AclEntry.newBuilder();builder.setFlags(flags);builder.setPermissions(permissions);builder.setPrincipal(userPrincipal);builder.setType(AclEntryType.DENY);AclEntry entry = builder.build();List<AclEntry> aclEntryList = new ArrayList<>();aclEntryList.add(entry);return aclEntryList;}@Overridepublic String name() {return "acl:acl";}};try {Files.createDirectory(newDirectoryPath, fileAttributes);} catch (IOException e) {System.err.println(e);} }要驗證在Windows 7中成功創建目錄及其文件屬性,請在給定文件夾的屬性中選擇“安全性”選項卡,然后單擊“高級”。 您新創建的條目應在呈現的表中列出,并具有類似于此條目的詳細信息視圖:
ACL條目示例(Windows 7)
創建一個新文件
任何與文件系統相關的代碼的核心部分通常都包含創建單個或多個文件的代碼。 要創建文件,我們需要再次使用Files類,并調用createFile方法。 就像目錄一樣,可以使用初始文件屬性創建文件,并且應用相同的限制。 話雖如此,我將不演示文件屬性的工作,因為它與目錄示例中的相同。 再一次,這是一個非常簡單的方法,沒有什么用處,因此下面的示例將介紹所有內容:
Path newFilePath = Paths.get("C:", "a.txt");if (!Files.exists(newFilePath)) {try {Files.createFile(newFilePath);} catch (IOException e) {System.err.println(e);} }請注意, exists檢查方法可以防止FileAlreadyExistsException 。
翻譯自: https://www.javacodegeeks.com/2014/06/creating-files-and-directories-in-nio-2.html
總結
以上是生活随笔為你收集整理的在NIO.2中创建文件和目录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查看您的Solr缓存大小:Eclipse
- 下一篇: 理财净值型怎么折算年化收益率?