在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 testPosix

ACL文件权限

在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)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现flash的图片切换效果【可以切换多个网页或者图片】

这个是得到改进后的代码&#xff0c;可以切换多个页面 需要完整代码的朋友可以留下email如需再添加切换页面&#xff0c;只要按照下边代码部分的样式添加内容即可切换导航td的id要顺序排那个div的TOP为为上边一个div的Top加上div本身的高度&#xff1a;2371<% Page Language…

《SpringMVC从入门到放肆》三、DispatcherServlet的url-pattern配置详解

上一篇我们详细解释了一下SrpingMVC的执行流程以及一些默认的配置&#xff0c;在Spring的思想中&#xff0c;就是默认大于配置。今天我们来详细的研究一下DispatcherServlet的url-pattern配置。 一、DispatcherServlet的url-pattern配置在没有特别要求的情况下&#xff0c;Spri…

vc中怎么使用SendMessage自定义消息函数

vc中怎么使用SendMessage自定义消息函数&#xff1a; SendMessage的基本结构如下&#xff1a; SendMessage( HWND hWnd, //消息传递的目标窗口或线程的句柄。 UINT Msg, //消息类别&#xff08;这里可以是一些系统消息&#xff0c;也可以是自己定义&#xff0c;下文具…

多路复用IO和异步IO

多路复用I/O 它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket&#xff0c;当某个socket有数据到达了&#xff0c;就通知用户进程。 流程图如下&#xff1a; 当用户进程调用了select&#xff0c;那么整个进程会被block&#xff0c;而同时&#xff0c…

Java开发人员应该知道的7种新工具

通过快速浏览一些最新的创新工具&#xff0c;随时准备锁定和加载。 万一您错过了它&#xff0c;RebelLabs最近发布了Java工具和技术前景的全球调查结果 。 除了著名的工具和成熟的工具外&#xff0c;市场还涌现出鲜有人知的新鲜工具和框架。 在这篇文章中&#xff0c;我决定收集…

leetcode-92-反转链表②

题目描述&#xff1a; 方法一: class Solution:def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:dummy ListNode(0)dummy.next headpre dummyfor i in range(m-1):pre pre.nextstart pre.nexttrail start.nextfor i in range(n-m):start.next …

linux 7 services设定,CENTOS/RHEL7系统中设置SYSTEMD SERVICE的ULIMIT资源限制

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;在bash中&#xff0c;有个ulimit命令&#xff0c;提供了对shell及该shell启动的进程的可用资源控制。主要包括打开文档描述符数量、用户的最大进程数量、coredump文…

ON_COMMAND_RANGE用法

afx_msg voidOnOutPutStatusButtonUp (WPARAM wParam, LPARAM lParam);BEGIN_MESSAGE_MAP(CIOStatue, CDialog)//{{AFX_MSG_MAP(CIOStatue)//}}AFX_MSG_MAPON_COMMAND_RANGE(IDC_STATIC_OUT1,IDC_STATIC_OUT16,OnOutPutStatusButtonUp)END_MESSAGE_MAP()//注意IDC_STATIC_OUT1…

在c语言中a 这条语句的作用,C语言复习第二章

C语言第二章C语言复习(第二章)一、填空1、若采用十进制数的表示形式&#xff0c;则077为( )&#xff0c;0111为( )&#xff0c;0xab为( )。 2、C语言中的标识符只能由3种字符组成&#xff0c;它们是( )、( )和( )。 3、在C语言中&#xff0c;用“\\”开头的字符序列称为转义字符…

自定义控件中使用Render的writer

给自定义控件一个模板并输出&#xff0c;可以在重写控件的Render&#xff0c;并使用它的HtmlTextWriter writer例如&#xff1a;publicclassMyTextBox : TextBox { private string _template"<tr><td> {0} </td><td> {1} </td>&l…

【ABAP系列】SAP 面试 ABAPer的一些感想

公众号&#xff1a;SAP Technical本文作者&#xff1a;matinal原文出处&#xff1a;http://www.cnblogs.com/SAPmatinal/ 原文链接&#xff1a;【ABAP系列】SAP 面试 ABAPer的一些感想前言部分 大家可以关注我的公众号&#xff0c;公众号里的排版更好&#xff0c;阅读更舒适。 …

mean技术栈 linux,“MEAN”技术栈开发web应用

var express require(express);var app express();app.listen(3000);var _rootDir __dirname;var protectDir _rootDir /protect/;app.use(express.static(_rootDir));//注册路由app.get(/, function(req, res){res.sendFile(_rootDir/src/index.html);});app.use(functio…

仔细研究Java Identity API

在深入探讨之前&#xff0c;让我们看一下有关Java Identity API JSR 351的一些快速事实。 这仍在进行中。 。 。 JSR是什么时候发起的&#xff1f; 该JSR在2011年10月通过了批准投票&#xff0c;随后在2011年11月成立了专家组。 谁负责此规范&#xff1f; Java Identity AP…

c语言按shift用户随时退出,2014年云南省“三校生”高考计算机第三次模拟试卷...

密班级&#xff1a; 姓名&#xff1a; 学号&#xff1a;密 封 线 内 不 得 答 题玉龙职高2012年高考第三次模拟试卷计算机基础总分&#xff1a;150分&#xff0c;考试时间&#xff1a;120分钟。一、单项选择题(在每小题给出的四个选项中&#xff0c;只有一个是符合题目要求的&a…

无状态EJB:池化和生命周期

无状态EJB池和生命周期的摘要视图&#xff08;注释&#xff09;。 对新手有用。 。 。 。 。 EJB池&#xff1a;快速概述 EJB实例存储在称为EJB池的位置–这不过是内存中的缓存 。 无状态EJB通常按需实例化&#xff0c;即&#xff0c;当客户端调用Bean上的方法时。 但是&…

代码整洁之道——有意义的命名(持续更新中)

我们给变量、参数、类、包&#xff0c;源代码和源代码所在目录命名&#xff0c;也给jar文件、war文件和ear文件命名。 We name variables, parameters, classes, packages, source code, and the directory where the source code resides, as well as jar files, war files, a…

fixed 语句(C# 参考)

fixed 语句禁止垃圾回收器重定位可移动的变量。fixed 语句只能出现在不安全的上下文中。Fixed 还可用于创建固定大小的缓冲区。 备注 fixed 语句设置指向托管变量的指针并在 statement 执行期间“钉住”该变量。如果没有 fixed 语句&#xff0c;则指向可移动托管变量的指针的作…

React Antd中样式的修改

如果需要对antd的样式进行修改&#xff0c; 进入你要修改的页面 注意&#xff1a;不能直接在自己的文件下面&#xff0c;加入一个css&#xff0c;修改这个class的样式&#xff0c;应该 加入global限定&#xff0c;global {} , 在{}里面写入 .classname {} 然后在设置css样式…

【Python】贪心算法入门

一.引言 本文将通过两个问题和两道例题带你入门贪心算法。 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取在当前状态下最优&#xff08;最好或最有利&#xff09;的选择&#xff0c;从而希望导致全局最优解的算法。贪心算法不保证找到全局最优…

ASP.NET MVC+LINQ开发一个图书销售站点(9):编辑目录

编辑目录和新建类似&#xff0c;这里我们用MVC提供的辅助类 1.在Model 的BookShopDBDataContext分部类里添加: 2. 在CategoryController添加如下方法(注意&#xff1a;我们添加了后端验证) 3. 修改View下的EditCategory.aspx. (注意&#xff1a;我们用了MVC提供的辅助类生成Tex…