java7 uri,细数Java8中那些让人纵享丝滑的文件操作

在丑陋的 Java I/O 编程方式诞生多年以后,Java终于简化了文件读写的基本操作。

打开并读取文件对于大多数编程语言来是非常常用的,由于 I/O 糟糕的设计以至于很少有人能够在不依赖其他参考代码的情况下完成打开文件的操作。

在 Java7 中对此引入了巨大的改进。这些新元素被放在java.nio.file包下面,过去人们通常把nio中的n理解为new即新的io,现在更应该当成是non-blocking非阻塞io(io就是input/output输入/输出)。java.nio.file库终于将 Java 文件操作带到与其他编程语言相同的水平。最重要的是 Java8 新增的 streams 与文件结合使得文件操作编程变得更加优雅。

看一下文件操作的两个基本组件:

文件或者目录的路径;

文件本身。

文件和目录路径

一个Path对象表示一个文件或者目录的路径,是一个跨操作系统(OS)和文件系统的抽象,目的是在构造路径时不必关注底层操作系统,代码可以在不进行修改的情况下运行在不同的操作系统上。java.nio.file.Paths类包含一个重载方法static get(),该方法接受一系列String字符串或一个统一资源标识符(URI)作为参数,并且进行转换返回一个Path对象。

当toString()方法生成完整形式的路径,getFileName()方法总是返回当前文件名。

通过使用Files工具类,可以测试一个文件是否存在,测试是否是一个”普通”文件还是一个目录等等。”Nofile.txt”这个示例展示我们描述的文件可能并不在指定的位置;这样可以允许你创建一个新的路径。”PathInfo.java”存在于当前目录中,最初它只是没有路径的文件名,但它仍然被检测为”存在”。一旦我们将其转换为绝对路径,我们将会得到一个从”C:”盘(因为我们是在Windows机器下进行测试)开始的完整路径,现在它也拥有一个父路径。

“真实”路径的定义在文档中有点模糊,因为它取决于具体的文件系统。例如,如果文件名不区分大小写,即使路径由于大小写的缘故而不是完全相同,也可能得到肯定的匹配结果。在这样的平台上,toRealPath()将返回实际情况下的Path,并且还会删除任何冗余元素。

这里你会看到URI看起来只能用于描述文件,实际上URI可以用于描述更多的东西;通过 维基百科 可以了解更多细节。现在我们成功地将URI转为一个Path对象。

Path中看到一些有点欺骗的东西,这就是调用toFile()方法会生成一个File对象。听起来似乎可以得到一个类似文件的东西(毕竟被称为File),但是这个方法的存在仅仅是为了向后兼容。虽然看上去应该被称为”路径”,实际上却应该表示目录或者文件本身。这是个非常草率并且令人困惑的命名,但是由于java.nio.file的存在我们可以安全地忽略它的存在。

选取路径部分片段

Path对象可以非常容易地生成路径的某一部分:

可以通过getName()来索引Path的各个部分,直到达到上限getNameCount()。Path也实现了Iterable接口,因此我们也可以通过增强的 for-each 进行遍历。请注意,即使路径以.java结尾,使用endsWith()方法也会返回false。这是因为使用endsWith()比较的是整个路径部分,而不会包含文件路径的后缀。通过使用startsWith()和endsWith()也可以完成路径的遍历。但是我们可以看到,遍历Path对象并不包含根路径,只有使用startsWith()检测根路径时才会返回true。

路径分析

Files工具类包含一系列完整的方法用于获得Path相关的信息。

在调用最后一个测试方法getPosixFilePermissions()之前我们需要确认一下当前文件系统是否支持Posix接口,否则会抛出运行时异常。

Paths的增减修改

我们必须能通过对Path对象增加或者删除一部分来构造一个新的Path对象。我们使用relativize()移除Path的根路径,使用resolve()添加Path的尾路径(不一定是“可发现”的名称)。

对于下面代码中的示例,我使用relativize()方法从所有的输出中移除根路径,部分原因是为了示范,部分原因是为了简化输出结果,这说明你可以使用该方法将绝对路径转为相对路径。

这个版本的代码中包含id,以便于跟踪输出结果:

目录

Files工具类包含大部分我们需要的目录操作和文件操作方法。出于某种原因,它们没有包含删除目录树相关的方法

删除目录树的方法实现依赖于Files.walkFileTree(),”walking” 目录树意味着遍历每个子目录和文件。Visitor 设计模式提供了一种标准机制来访问集合中的每个对象,然后你需要提供在每个对象上执行的操作。

此操作的定义取决于实现的FileVisitor的四个抽象方法,包括:

preVisitDirectory()

在访问目录中条目之前在目录上运行。

visitFile():调用目录中的文件

visitFileFailed()

调用无法被访问的文件。如果该文件的属性不能被读取,该文件是无法打开一个目录,以及其他原因,该方法被调用。

postVisitDirectory()

在访问目录中条目之后在目录上运行,包括所有的子目录。

为了简化,java.nio.file.SimpleFileVisitor提供了所有方法的默认实现

在自己的匿名内部类中,只需要重写非标准行为的方法:visitFile()和postVisitDirectory()实现删除文件和删除目录。两者都应该返回标志位决定是否继续访问

作为探索目录操作的一部分,现在我们可以有条件地删除已存在的目录。在以下例子中,makeVariant()接受基本目录测试,并通过旋转部件列表生成不同的子目录路径。这些旋转与路径分隔符sep使用String.join()贴在一起,然后返回一个Path对象。

如果你对于已经存在的目录调用createDirectory()将会抛出异常。createFile()使用参数Path创建一个空文件;resolve()将文件名添加到test Path的末尾。

我们尝试使用createDirectory()来创建多级路径,但是这样会抛出异常,因为这个方法只能创建单级路径。我已经将populateTestDir()作为一个单独的方法,因为它将在后面的例子中被重用。对于每一个变量variant,我们都能使用createDirectories()创建完整的目录路径,然后使用此文件的副本以不同的目标名称填充该终端目录。然后我们使用createTempFile()生成一个临时文件。

在调用populateTestDir()之后,我们在test目录下面下面创建一个临时目录。请注意,createTempDirectory()只有名称的前缀选项。与createTempFile()不同,我们再次使用它将临时文件放入新的临时目录中。你可以从输出中看到,如果未指定后缀,它将默认使用”.tmp”作为后缀。

为了展示结果,我们首次使用看起来很有希望的newDirectoryStream(),但事实证明这个方法只是返回test目录内容的 Stream 流,并没有更多的内容。要获取目录树的全部内容的流,请使用Files.walk()。

文件系统

为了完整起见,我们需要一种方法查找文件系统相关的其他信息。在这里,我们使用静态的FileSystems工具类获取”默认”的文件系统,但也可以在Path对象上调用getFileSystem()以获取创建该Path的文件系统。

可以获得给定 URI 的文件系统,还可以构建新的文件系统(对于支持它的操作系统)。

路径监听

通过WatchService可以设置一个进程对目录中的更改做出响应。

一旦我们从FileSystem中得到了WatchService对象,我们将其注册到test路径以及我们感兴趣的项目的变量参数列表中,可以选择

ENTRY_CREATE

ENTRY_DELETE

ENTRY_MODIFY(其中创建和删除不属于修改)。

接下来对watcher.take()的调用会在发生某些事情之前停止所有操作,所以我们希望deltxtfiles()能够并行运行以便生成我们感兴趣的事件。为了实现这个目的,通过调用Executors.newSingleThreadScheduledExecutor()产生一个ScheduledExecutorService对象,然后调用schedule()方法传递所需函数的方法引用,并且设置在运行之前应该等待的时间。

此时,watcher.take()将等待并阻塞在这里。当目标事件发生时,会返回一个包含WatchEvent的Watchkey对象。

如果说”监视这个目录”,自然会包含整个目录和下面子目录,但实际上的:只会监视给定的目录,而不是下面的所有内容。如果需要监视整个树目录,必须在整个树的每个子目录上放置一个Watchservice。

文件查找

粗糙的方法,在 path 上调用 toString(),然后使用 string 操作查看结果。

java.nio.file 有更好的解决方案:通过在 FileSystem 对象上调用 getPathMatcher() 获得一个 PathMatcher,然后传入感兴趣的模式。

模式

glob

glob 比较简单,实际上功能非常强大,因此可以使用 glob 解决许多问题。

在 matcher 中,glob 表达式开头的 **/ 表示“当前目录及所有子目录”,这在当你不仅仅要匹配当前目录下特定结尾的 Path 时非常有用。

单 * 表示“任何东西”,然后是一个点,然后大括号表示一系列的可能性—-我们正在寻找以 .tmp 或 .txt 结尾的东西

regex

如果问题更复杂,可以使用 regex

文件读写

如果一个文件很“小”,也就是说“它运行得足够快且占用内存小”,那么 java.nio.file.Files 类中的实用程序将帮助你轻松读写文本和二进制文件。

Files.readAllLines() 一次读取整个文件(因此,“小”文件很有必要),产生一个List。

只需将 Path 传递给 readAllLines()

readAllLines() 有一个重载版本,包含一个 Charset 参数来存储文件的 Unicode 编码

Files.write() 被重载以写入 byte 数组或任何 Iterable 对象(它也有 Charset 选项):

如果文件大小有问题怎么办? 比如说:

文件太大,如果你一次性读完整个文件,你可能会耗尽内存。

您只需要在文件的中途工作以获得所需的结果,因此读取整个文件会浪费时间。

Files.lines() 方便地将文件转换为行的 Stream:

流式处理,跳过 13 行,然后选择下一行并将其打印出来。

Files.lines() 对于把文件处理行的传入流时非常有用,但是如果你想在 Stream 中读取,处理或写入怎么办?这就需要稍微复杂的代码:

因为我们在同一个块中执行所有操作,所以这两个文件都可以在相同的 try-with-resources 语句中打开。

PrintWriter 是一个旧式的 java.io 类,允许你“打印”到一个文件,所以它是这个应用的理想选择

总结

虽然本章对文件和目录操作做了相当全面的介绍,但是仍然有没被介绍的类库中的功能——一定要研究 java.nio.file 的 Javadocs,尤其是 java.nio.file.Files 这个类。

Java 7 和 8 对于处理文件和目录的类库做了大量改进。如果您刚刚开始使用 Java,那么您很幸运。在过去,它令人非常不愉快,Java 设计者以前对于文件操作不够重视才没做简化。对于初学者来说这是一件很棒的事,对于教学者来说也一样。我不明白为什么花了这么长时间来解决这个明显的问题,但不管怎么说它被解决了,我很高兴。使用文件现在很简单,甚至很有趣,这是你以前永远想不到的。

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

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

相关文章

混合现实未来的八大应用场景

来源:诚迈科技近日,福布斯发布了一篇关于混合现实未来的八个值得关注的领域和应用场景。文中提到:随着时间的推移,技术永远在不断进展,而未来技术中很可能是AR和VR的结合形式。有报告显示:2024年&#xff0…

也来分析为什么支付宝要做社交

也来分析为什么支付宝要做社交 近期。身边的同事和朋友似乎对使用支付宝有点“走火入魔”了。常常有人在支付宝里面请求加我为好友。大家在食堂吃饭的时候也在讨论今天加了谁谁谁为好友。一问才知道。原来假设加入好友达到一定的数量,将有机会在春节期间抢支付宝发出…

4个重要的量子理论实验综述

文章原载于:大数据01 量子理论量子理论是一个容易让人迷惑的理论,因此,如果我们想准确地了解其概况,就需要非常谨慎。与大多数自牛顿著作和其他17世纪晚期科学家著作问世以来出现的物理学成果一样,量子理论是一个以数学…

php中intval函数用法,php intval函数用法总结

语法:int intval ( $var, $base )参数:此函数接受两个参数,其中一个是必需的,而另一个是可选的。参数如下所述:$var:这是一个必需参数,用作需要转换为整数值的变量。$base:它是一个可…

转:mysql group by 用法解析(详细)

group by 用法解析 group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。 SELECT子句中的列名必须为分组列或列函数。列函数对于GROUP BY子句定义的每个组各返回一个结果。 某个员工信息表结构和数据如下: id name…

前沿|《细胞》:绕过眼睛植入幻觉,科学家成功在盲人脑海中呈现指定图像!...

该文章内容转载自学术头条对于全球 5000 多万盲人来说,重见光明是一个遥不可及的梦想。而为了与盲人朋友进行交互,我们发明了盲文,用各种凸起的字符集合来表达各种意思。但这种通过手指触摸来识别的方式太过低效。随着脑科学研究的深入&#…

mysql error1045 yes,MySQLERROR1045(28000)错误的解决办法

错误现象:ERROR 1045 (28000): Access denied for userODBClocalhost(using password: NO)ERROR 1045 (28000): Access denied for userODBClocalhost(using password: YES)windows下,以上两个错误的解决方法,本人亲测有效,现分享…

软件测试常考面试题-软件测试面试宝典 ---面试过程中踩过的坑

问:你在测试中发现了一个 bug ,但是开发经理认为这不是一个 bug ,你应该怎样解决。 首先,将问题提交到缺陷管理库里面进行备案。 然后,要获取判断的依据和标准: 根据需求说明书、产品说明、设计文档等&am…

Soft robotics:造仿生昆虫机器人柔性骨骼新技术,只需2小时,成本不到7块!

来源:量子位原标题:只需2小时,成本不到7块,你我皆可制作的3D机器人机器人的骨架能像昆虫那般灵活、健壮吗?这个问题一直困扰着研究人员。以往,要么制作工艺太过复杂,耗的时间长;要么…

向量归一化的matlab程序,向量X的归一化及其Matlab简单示例

徐海蛟博士归一化是要把需要处理的数据经过处理后限制在一定范围内,例如:[-1,1]或[0,1]。归一化是为了后续数据处理的方便,也使得算法程序收敛加快。在Matlab里面,归一化的方法共有3种:(1)mapminmax% 范围映射(2)mapstd% 均值与偏…

vue中检测对象和数组值变化的问题

今天工作中遇到改变vue data中某个对象的值,却无法触发视图更新的问题。看了看官方文档,怎么解决的呢? 1、检测对象的变化 受现代 JavaScript 的限制(以及废弃 Object.observe),Vue 不能检测到对象属性的添…

2019-2020年半导体行业深度报告

来源:华安证券新科技起点,不可缺芯半导体位于电子行业中游。通过集成电路、分立器件、被动器件在 PCB 上组合形 成模组,构成了手机、电脑、工业、航空航天、军事装备等电子产品的核心。这些产 品又直接影响到国家的发展、社会的进步以及个人的…

php tool pagination,php实现分页工具类分享

代码:/*** 把中间的看成一个可以滑动的固定长度的尺子** 把$this->_totalShowPages 当成一个可以滑动的固定长度尺子,* 然后$this->_totalPages就是一个给定长度的木块,尺子在这个* 木块上滑动。情况两种:* 1. 尺子长度大于…

js题集15

1.CORS和JSONP区别? 2.如何规避同源策略? eg:访问iframe 3.如何实现 一个算法的不变的部分,并将可变的行为留给子类来实现 简单写一个demo转载于:https://www.cnblogs.com/tong24/p/7305772.html

5G 智慧城市安全参考架构概述

来源:安全内参2020年5月12日,IMT-2020(5G)推进组安全工作组发布了《5G智慧城市安全需求与架构白皮书》,本文节选自该白皮书,主要概述了5G 智慧城市安全参考框架。该框架是参考GB/T 37971-2019《信息安全技术 智慧城市安全体系框架…

vue 学习笔记—路由篇

一.关于三种路由 动态路由 就是path:good/:ops 这种 用 $route.params接收  <router-link>是用来跳转 <router-view></router-view>用来盛放内容的容易 在routes 里面进行配置 [{ path:,name:,component:}] path为router-link的路径 component为 …

MEMS传感器的未来在哪?

来源&#xff1a;MEMS技术1 引言陀螺是用于测量载体相对惯性空间旋转运动中运动角速度和角度的传感器&#xff0c;是运动控制、姿态监测、导航制导等领域的核心器件&#xff0c;在工业和国防领域具有广泛且重要的应用。陀螺从原理上可分为基于高速旋转刚体的定轴性与进动性工作…

php获取控制器返回,thinkphp获取所有控制器的方法

protected function getController($module){if(empty($module)) return null;$module_path APP_PATH . / . $module . /Controller/; //控制器路径if(!is_dir($module_path)) return null;$module_path . /*.class.php;$ary_files glob($module_path);foreach ($ary_files a…

Jquery一些笔记

【1】|| 是逻辑 || 是逻辑或&#xff0c;如果前一个表达式为true&#xff0c;就可以直接判定结果为true&#xff0c;从而不再执行后一个表达式&#xff1b;只有当前一个表达式为false时&#xff0c;才执行后一个表达式。 javascript中&#xff0c;null&#xff0c;0&#xff0c…

黑科技:绕过眼睛植入幻觉,科学家成功在盲人脑海中呈现指定图像!

来源 | 学术头条&#xff08;ID:SciTouTiao&#xff09;头图 | CSDN付费下载自视觉中国对于全球 5000 多万盲人来说&#xff0c;重见光明是一个遥不可及的梦想。而为了与盲人朋友进行交互&#xff0c;我们发明了盲文&#xff0c;用各种凸起的字符集合来表达各种意思。但这种通过…