java基础教程网站(java教程官网)

java基础教程网站(java教程官网)svg xmlns http www w3 org 2000 svg style display none svg

大家好,我是讯享网,很高兴认识大家。



 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <blockquote> 

讯享网

原文:

原文:

就像数据流支持原始数据类型的 I/O 一样,对象流支持对象的 I/O。大多数标准类支持其对象的序列化,但并非所有类都支持。那些实现了标记接口的类支持序列化。

对象流类是和。这些类实现了和,它们是和的子接口。这意味着在对象流中也实现了数据流中涵盖的所有原始数据 I/O 方法。因此,对象流可以包含原始值和对象值的混合。示例说明了这一点。创建了与相同的应用程序,但有一些变化。首先,价格现在是对象,以更好地表示分数值。其次,一个对象被写入数据文件,表示发票日期。

如果没有返回预期的对象类型,尝试将其强制转换为正确类型可能会抛出。在这个简单的例子中,这种情况不会发生,所以我们不尝试捕获异常。相反,我们通过将添加到方法的子句中来通知编译器,我们已经意识到了这个问题。

和方法使用起来很简单,但它们包含一些非常复杂的对象管理逻辑。对于像日历这样只封装原始值的类来说,这并不重要。但是许多对象包含对其他对象的引用。如果要从流中重建一个对象,它必须能够重建原始对象引用的所有对象。这些额外的对象可能有它们自己的引用,依此类推。在这种情况下,遍历整个对象引用网络,并将该网络中的所有对象写入流中。因此,一次调用可能导致大量对象被写入流中。

这在下图中有所展示,其中调用来写入一个名为a的单一对象。这个对象包含对对象bc的引用,而b包含对de的引用。调用不仅写入a,还写入了重建a所需的所有对象,因此这个网络中的其他四个对象也被写入了。当a被读回时,其他四个对象也被读回,并且所有原始对象引用都被保留。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
讯享网

多个被引用对象的 I/O

你可能会想知道,如果同一流上的两个对象都包含对同一对象的引用会发生什么。当它们被读回时,它们会都指向同一个对象吗?答案是"是"。一个流只能包含一个对象的副本,尽管它可以包含任意数量的引用。因此,如果你明确地将一个对象两次写入流中,实际上只是写入了引用两次。例如,如果以下代码将对象两次写入流中:

讯享网

每个都必须与一个匹配,因此读取流的代码看起来会像这样:

 

这导致了两个变量,和,它们都是指向同一个对象的引用。

然而,如果一个单一对象被写入两个不同的流,它实际上会被复制 — 一个程序读取这两个流将看到两个不同的对象。

译文:


注意: 本教程反映了 JDK 7 版本中引入的文件 I/O 机制。Java SE 6 版本的文件 I/O 教程很简短,但您可以下载包含早期文件 I/O 内容的Java SE Tutorial 2008-03-14版本的教程。


包及其相关包为文件 I/O 和访问默认文件系统提供了全面支持。尽管 API 有许多类,但您只需关注其中的一些入口点。您会发现这个 API 非常直观和易于使用。

本教程首先询问什么是路径?然后介绍了该包的主要入口点 Path 类。解释了与语法操作相关的类中的方法。然后教程转向包中的另一个主要类类,其中包含处理文件操作的方法。首先介绍了许多 file operations 共有的一些概念。然后介绍了用于检查、删除、复制和移动文件的方法。

教程展示了在继续学习 file I/O 和 directory I/O 之前如何管理元数据。解释了随机访问文件并检查了与符号链接和硬链接相关的问题。

接下来,涵盖了一些非常强大但更高级的主题。首先演示了递归遍历文件树的能力,然后介绍了如何使用通配符搜索文件的信息。接下来,解释并演示了如何监视目录以进行更改。然后,给出了一些其他地方不适用的方法的关注。

最后,如果您在 Java SE 7 发布之前编写了文件 I/O 代码,有一个从旧 API 到新 API 的映射,以及关于方法的重要信息,供希望利用新 API 而无需重写现有代码的开发人员参考。

原文:

文件系统在某种介质上存储和组织文件,通常是一个或多个硬盘,以便可以轻松检索文件。今天大多数使用的文件系统将文件存储在树(或分层)结构中。树的顶部是一个(或多个)根节点。在根节点下面,有文件和目录(在 Microsoft Windows 中称为文件夹)。每个目录可以包含文件和子目录,子目录又可以包含文件和子目录,依此类推,可能深入到几乎无限的深度。

本节涵盖以下内容:

  • 什么是路径?
  • 相对还是绝对?
  • 符号链接

以下图显示了包含单个根节点的示例目录树。Microsoft Windows 支持多个根节点。每个根节点映射到一个卷,例如或。Solaris OS 支持单个根节点,用斜杠字符表示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传示例目录结构

文件通过其在文件系统中的路径来标识,从根节点开始。例如,在前面的图中,Solaris OS 中的文件由以下表示:

讯享网

在 Microsoft Windows 中,由以下表示:

 

用于分隔目录名称的字符(也称为分隔符)特定于文件系统:Solaris OS 使用正斜杠(),而 Microsoft Windows 使用反斜杠()。

路径可以是相对的或绝对的。绝对路径始终包含根元素和完整的目录列表,以定位文件。例如,是一个绝对路径。定位文件所需的所有信息都包含在路径字符串中。

相对路径需要与另一个路径结合才能访问文件。例如,是一个相对路径。没有更多信息,程序无法可靠地定位文件系统中的目录。

文件系统对象通常是目录或文件。每个人都熟悉这些对象。但是一些文件系统也支持符号链接的概念。符号链接也称为symlinksoft link

符号链接是一个特殊文件,用作指向另一个文件的引用。在大多数情况下,符号链接对应用程序是透明的,对符号链接的操作会自动重定向到链接的目标。(被指向的文件或目录称为链接的目标。)例外情况是当符号链接被删除或重命名时,链接本身被删除或重命名,而不是链接的目标。

在下图中,对用户来说,看起来像是一个常规文件,但实际上它是指向的符号链接。是链接的目标。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传符号链接示例。

对用户来说,符号链接通常是透明的。读取或写入符号链接与读取或写入任何其他文件或目录相同。

解析链接这个短语意味着用文件系统中的实际位置替换符号链接。在这个例子中,解析会得到。

在现实场景中,大多数文件系统广泛使用符号链接。偶尔,粗心创建的符号链接可能会导致循环引用。循环引用发生在链接的目标指向原始链接的情况下。循环引用可能是间接的:目录指向目录,后者指向目录,后者包含一个子目录指向目录。当程序递归遍历目录结构时,循环引用可能会造成混乱。然而,这种情况已经考虑到,不会导致程序无限循环。

下一页将讨论 Java 编程语言中文件 I/O 支持的核心,即类。

原文:

类是 Java SE 7 版本中引入的主要入口点之一,属于包。如果您的应用程序使用文件 I/O,您将希望了解此类的强大功能。


版本说明: 如果您有使用的 JDK7 之前的代码,您仍然可以通过使用方法来利用类的功能。有关更多信息,请参阅旧版文件 I/O 代码。


正如其名称所示,类是文件系统中路径的程序表示。对象包含用于构建路径的文件名和目录列表,并用于检查、定位和操作文件。

一个实例反映了底层平台。在 Solaris 操作系统中,使用 Solaris 语法(),而在 Microsoft Windows 中,使用 Windows 语法()。不是系统独立的。你不能比较来自 Solaris 文件系统的并期望它与来自 Windows 文件系统的匹配,即使目录结构相同,两个实例都定位到相同的相对文件。

与对应的文件或目录可能不存在。您可以创建一个实例并以各种方式操作它:您可以附加到它,提取它的部分,将其与另一个路径进行比较。在适当的时候,您可以使用类中的方法来检查与对应的文件的存在性,创建文件,打开文件,删除文件,更改其权限等。

下一页将详细讨论类。

原文:

类包括各种方法,可用于获取有关路径的信息,访问路径的元素,将路径转换为其他形式或提取路径的部分。还有用于匹配路径字符串的方法以及用于删除路径中冗余的方法。本课程介绍了这些方法,有时称为语法操作,因为它们作用于路径本身,而不访问文件系统。

本节涵盖以下内容:

  • 创建一个 Path
  • 检索有关 Path 的信息
  • 从 Path 中删除冗余
  • 转换 Path
  • 连接两个路径
  • 在两个路径之间创建路径
  • 比较两个路径

一个实例包含用于指定文件或目录位置的信息。在定义时,会提供一系列一个或多个名称。可能包括根元素或文件名,但都不是必需的。可能仅包含单个目录或文件名。

您可以通过使用(注意复数形式)辅助类中的以下方法之一轻松创建对象:

讯享网

方法是以下代码的简写:

 

以下示例假定您的主目录是,则创建,或者如果您在 Windows 上,则为。

讯享网

你可以将看作将这些名称元素存储为序列。目录结构中最高的元素位于索引 0。目录结构中最低的元素位于索引,其中是中名称元素的数量。可用于使用这些索引检索单个元素或的子序列的方法。

本课程中的示例使用以下目录结构。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传示例目录结构

以下代码片段定义了一个实例,然后调用了几种方法以获取有关路径的信息:

 

这是 Windows 和 Solaris OS 的输出:

调用的方法Solaris OS 中的返回Microsoft Windows 中的返回注释返回的字符串表示。如果路径是使用或(后者是的便利方法)创建的,则该方法会执行轻微的语法清理。例如,在 UNIX 操作系统中,它将修正输入字符串为。返回文件名或名称元素序列的最后一个元素。返回与指定索引对应的路径元素。第 0 个元素是最靠近根的路径元素。返回路径中的元素数量。返回的子序列(不包括根元素),由开始和结束索引指定。返回父目录的路径。返回路径的根。

前面的示例显示了绝对路径的输出。在以下示例中,指定了相对路径:

讯享网

以下是 Windows 和 Solaris OS 的输出:

调用的方法Solaris OS 中返回Microsoft Windows 中返回

许多文件系统使用“.”符号表示当前目录,“…”表示父目录。您可能会遇到路径包含冗余目录信息的情况。也许服务器配置为将其日志文件保存在“”目录中,您希望从路径中删除末尾的“/.`”符号。

以下示例都包含冗余:

 

方法会删除任何冗余元素,包括任何“.directory/…/home/joe/foo`。

值得注意的是,在清理路径时不会检查文件系统。这是一个纯语法操作。在第二个示例中,如果是一个符号链接,删除可能导致不再定位到预期的文件。

为了清理路径并确保结果定位到正确的文件,您可以使用方法。该方法在下一节转换路径中描述。

您可以使用三种方法来转换。如果需要将路径转换为可以从浏览器打开的字符串,可以使用。例如:

讯享网

方法将路径转换为绝对路径。如果传入的路径已经是绝对路径,则返回相同的对象。在处理用户输入的文件名时,方法非常有帮助。例如:

 

方法转换用户输入并返回一个,在查询时返回有用的值。此方法不需要文件存在即可工作。

方法返回现有文件的真实路径。该方法一次执行多个操作:

  • 如果向该方法传递,并且文件系统支持符号链接,则该方法会解析路径中的任何符号链接。
  • 如果是相对路径,则返回绝对路径。
  • 如果包含任何多余的元素,则返回一个删除了这些元素的路径。

如果文件不存在或无法访问,则此方法会抛出异常。您可以在需要处理这些情况时捕获异常。例如:

讯享网

您可以使用方法组合路径。您传入一个部分路径,即不包括根元素的路径,并将该部分路径附加到原始路径。

例如,考虑以下代码片段:

 

将绝对路径传递给方法会返回传入的路径:

讯享网

在编写文件 I/O 代码时,通常需要能够构造从文件系统中的一个位置到另一个位置的路径。您可以使用方法来实现这一点。该方法构造一个源自原始路径并以传入路径指定的位置结束的路径。新路径是相对于原始路径的。

例如,考虑两个定义为和的相对路径:

 

在没有其他信息的情况下,假定和是兄弟姐妹,即在树结构中处于同一级别的节点。要从导航到,你需要先向上导航一级到父节点,然后再向下导航到:

讯享网

考虑一个稍微复杂的例子:

 

在这个例子中,这两个路径共享相同的节点。要从导航到,你首先向下导航一级到,然后再向下导航一级到。从到的导航需要向上移动两级。

如果只有一个路径包含根元素,则无法构造相对路径。如果两个路径都包含根元素,则构造相对路径的能力取决于系统。

递归示例使用和方法。

类支持,使您能够测试两个路径是否相等。和方法使您能够测试路径是否以特定字符串开头或结尾。这些方法易于使用。例如:

讯享网

类实现了接口。方法返回一个对象,使你能够遍历路径中的名称元素。返回的第一个元素是在目录树中最接近根的元素。以下代码片段遍历一个路径,打印每个名称元素:

 

类还实现了接口。你可以使用比较对象,这对于排序很有用。

你也可以将对象放入中。查看 Collections trail,了解更多关于这一强大功能的信息。

当你想要验证两个对象是否定位到同一文件时,可以使用方法,如 Checking Whether Two Paths Locate the Same File 中所述。

原文:

类是包的另一个主要入口点。该类提供了丰富的静态方法集,用于读取、写入和操作文件和目录。方法适用于对象的实例。在继续阅读其余部分之前,您应该熟悉以下常见概念:

  • 释放系统资源
  • 捕获异常
  • 可变参数
  • 原子操作
  • 方法链
  • 什么是 Glob?
  • 链接感知

此 API 中使用的许多资源,如流或通道,实现或扩展了接口。资源的要求是在不再需要时必须调用方法来释放资源。忽略关闭资源可能会对应用程序的性能产生负面影响。下一节描述的with-resources 语句会为您处理此步骤。

在文件 I/O 中,意外情况是生活中的一个事实:文件存在(或不存在)时预期的,程序无法访问文件系统,默认文件系统实现不支持特定功能,等等。可能会遇到许多错误。

所有访问文件系统的方法都可能抛出。**做法是通过将这些方法嵌入到 Java SE 7 版本中引入的with-resources 语句中来捕获这些异常。with-resources 语句的优点是编译器在不再需要时会自动生成关闭资源的代码。以下代码显示了这种情况可能如何:

讯享网

有关更多信息,请参阅 try-with-resources 语句。

或者,您可以将文件 I/O 方法嵌入到块中,然后在块中捕获任何异常。如果您的代码已打开任何流或通道,则应在块中关闭它们。使用 try-catch-finally 方法的前一个示例可能如下所示:

 

有关更多信息,请参阅捕获和处理异常。

除了,许多特定异常扩展了。这个类有一些有用的方法,返回涉及的文件(),详细的消息字符串(),文件系统操作失败的原因(),以及涉及的“其他”文件(如果有)()。

以下代码片段展示了方法可能如何使用:

讯享网

为了清晰起见,本课程中的文件 I/O 示例可能不显示异常处理,但您的代码应始终包含它。

当指定标志时,几个方法接受任意数量的参数。例如,在以下方法签名中,参数后的省略号表示该方法接受可变数量的参数,通常称为可变参数

 

当一个方法接受可变参数时,您可以传递逗号分隔的值列表或值数组()。

在示例中,该方法可以如下调用:

讯享网

有关可变参数语法的更多信息,请参见可变参数。

几个方法,比如,可以在一些文件系统中以原子方式执行某些操作。

原子文件操作是一种不能被中断或“部分”执行的操作。要么整个操作被执行,要么操作失败。当您有多个进程在文件系统的同一区域上操作,并且您需要保证每个进程访问完整的文件时,这一点就很重要。

许多文件 I/O 方法支持方法链的概念。

首先调用返回对象的方法。然后立即在对象上调用一个方法,该方法返回另一个对象,依此类推。许多 I/O 示例使用以下技术:

 

这种技术产生了紧凑的代码,并使您能够避免声明您不需要的临时变量。

类中有两个方法接受通配符参数,但是通配符是什么?

您可以使用通配符语法来指定模式匹配行为。

通配符模式被指定为一个字符串,并与其他字符串(如目录或文件名)匹配。通配符语法遵循几个简单的规则:

  • 星号匹配任意数量的字符(包括零个)。
  • 两个星号的工作方式类似于,但跨越目录边界。这种语法通常用于匹配完整路径。
  • 问号,,匹配恰好一个字符。
  • 大括号指定一组子模式。例如:
    • 匹配"太阳"、“月亮"或"星星”。
    • 匹配所有以"temp"或"tmp"开头的字符串。
  • 方括号传达一组单个字符,或者当使用连字符字符()时,传达一组字符范围。例如:
    • 匹配任何小写元音字母。
    • 匹配任何数字。
    • 匹配任何大写字母。
    • 匹配任何大写或小写字母。在方括号内,、和代表它们自身。
  • 所有其他字符都代表它们自身。
  • 要匹配、或其他特殊字符,可以使用反斜杠字符进行转义。例如:匹配一个反斜杠,匹配问号。

以下是一些通配符语法示例:

  • – 匹配所有以 .html 结尾的字符串
  • – 匹配所有恰好有三个字母或数字的字符串
  • – 匹配所有包含数字值的字符串
  • – 匹配任何以 .htm.html.pdf 结尾的字符串
  • – 匹配任何以 开头,后跟至少一个字母或数字,并以 .java 结尾的字符串
  • – 匹配任何以 foo 开头的字符串或任何包含数字值的字符串

注意: 如果您正在键盘上输入通配符模式,并且其中包含一个特殊字符,您必须将模式放在引号中(),使用反斜杠(),或使用命令行支持的任何转义机制。


通配符语法功能强大且易于使用。但是,如果它不满足您的需求,您也可以使用正则表达式。有关更多信息,请参阅正则表达式 课程。

有关通配符语法的更多信息,请参阅 类中 方法的 API 规范。

类是"链接感知"的。每个 方法都会检测在遇到符号链接时该做什么,或者提供一个选项,使您能够配置在遇到符号链接时的行为。

原文:

您有一个代表文件或目录的实例,但该文件是否存在于文件系统中?它是否可读?可写?可执行?

类中的方法是语法的,意味着它们在实例上操作。但最终您必须访问文件系统来验证特定的是否存在或不存在。您可以使用和方法。请注意,并不等同于。当您测试文件的存在时,可能有三种结果:

  • 验证文件存在。
  • 验证文件不存在。
  • 文件的状态未知。当程序无法访问文件时,会出现此结果。

如果和都返回,则无法验证文件的存在。

要验证程序是否可以按需访问文件,可以使用、和方法。

以下代码片段验证特定文件是否存在,并且程序是否有执行文件的能力。

讯享网

注意: 一旦其中任何方法完成,就不能保证可以访问文件。许多应用程序中的常见安全漏洞是执行检查然后访问文件。要获取更多信息,请使用您喜欢的搜索引擎查找(发音为TOCK-too)。


当您有一个使用符号链接的文件系统时,可能会有两个不同的路径定位到同一个文件。方法比较两个路径,以确定它们是否在文件系统上定位到同一个文件。例如:

 

原文:

您可以删除文件、目录或链接。对于符号链接,删除的是链接本身而不是链接的目标。对于目录,目录必须为空,否则删除操作将失败。

类提供了两种删除方法。

方法会删除文件,如果删除失败则会抛出异常。例如,如果文件不存在,则会抛出异常。您可以捕获异常以确定删除失败的原因,如下所示:

讯享网

方法也会删除文件,但如果文件不存在,则不会抛出异常。静默失败在您有多个线程删除文件时很有用,您不希望仅因为一个线程先执行删除操作就抛出异常。

原文:

您可以使用方法复制文件或目录。如果目标文件存在,则复制将失败,除非指定了选项。

目录可以被复制。但是,目录内的文件不会被复制,因此即使原始目录包含文件,新目录也是空的。

复制符号链接时,会复制链接的目标。如果要复制链接本身而不是链接的内容,请指定或选项。

这种方法接受可变参数。支持以下和枚举:

  • – 即使目标文件已经存在,也执行复制。如果目标是符号链接,则复制链接本身(而不是链接的目标)。如果目标是非空目录,则复制将失败,并显示异常。
  • – 复制与文件关联的文件属性到目标文件。支持的确切文件属性取决于文件系统和平台,但在各个平台上都受支持,并且会被复制到目标文件。
  • – 表示不应跟随符号链接。如果要复制的文件是符号链接,则复制链接本身(而不是链接的目标)。

如果您不熟悉,请参见枚举类型。

以下显示了如何使用方法:

 

除了文件复制外,类还定义了可用于文件和流之间复制的方法。方法可用于将输入流的所有字节复制到文件。方法可用于将文件的所有字节复制到输出流。

示例使用和方法支持递归复制。有关更多信息,请参见遍历文件树。

原文:

您可以使用方法移动文件或目录。如果目标文件存在,则移动失败,除非指定了选项。

空目录可以被移动。如果目录不为空,只有当可以移动目录而不移动该目录的内容时才允许移动。在 UNIX 系统上,将目录移动到同一分区通常是重命名目录。在这种情况下,即使目录包含文件,此方法也有效。

此方法接受可变参数 – 支持以下枚举:

  • – 即使目标文件已经存在,也执行移动操作。如果目标是一个符号链接,符号链接会被替换,但它指向的内容不受影响。
  • – 将移动操作作为原子文件操作执行。如果文件系统不支持原子移动,则会抛出异常。使用,您可以将文件移动到目录中,并确保任何监视目录的进程访问完整文件。

以下展示了如何使用方法:

讯享网

尽管可以像所示在单个目录上实现方法,但该方法通常与文件树递归机制一起使用。有关更多信息,请参见遍历文件树。

原文:

元数据的定义是“关于其他数据的数据”。在文件系统中,数据包含在其文件和目录中,元数据跟踪每个对象的信息:它是一个常规文件、目录还是链接?它的大小、创建日期、最后修改日期、文件所有者、组所有者和访问权限是什么?

文件系统的元数据通常被称为其文件属性。类包括可用于获取文件的单个属性或设置属性的方法。

方法说明返回指定文件的大小(以字节为单位)。如果指定的定位到一个目录,则返回 true。如果指定的定位到一个常规文件,则返回 true。如果指定的定位到一个符号链接文件,则返回 true。如果指定的定位到文件系统认为是隐藏的文件,则返回 true。 返回或设置指定文件的最后修改时间。 返回或设置文件的所有者。 返回或设置文件的 POSIX 文件权限。 返回或设置文件属性的值。

如果程序需要同时获取多个文件属性,使用检索单个属性的方法可能效率低下。反复访问文件系统以检索单个属性可能会对性能产生不利影响。因此, 类提供了两个 方法,以便一次性获取文件的属性。

方法注释作为批量操作读取文件的属性。 参数标识要读取的属性。作为批量操作读取文件的属性。 参数是请求的属性类型,该方法返回该类的对象。

在展示 方法的示例之前,应该提到不同的文件系统对应该跟踪哪些属性有不同的概念。因此,相关文件属性被分组到视图中。视图 映射到特定的文件系统实现,如 POSIX 或 DOS,或者映射到常见功能,如文件所有权。

支持的视图如下:

  • – 提供必须由所有文件系统实现支持的基本属性视图。
  • – 将基本属性视图扩展为在支持 DOS 属性的文件系统上支持的标准四位。
  • – 将基本属性视图扩展到支持 POSIX 标准族的文件系统上支持的属性,例如 UNIX。这些属性包括文件所有者、组所有者和九个相关的访问权限。
  • – 受到支持文件所有者概念的任何文件系统实现支持。
  • – 支持读取或更新文件的访问控制列表(ACL)。支持 NFSv4 ACL 模型。任何 ACL 模型,例如 Windows ACL 模型,如果与 NFSv4 模型有明确定义的映射,也可能受支持。
  • – 支持用户定义的元数据。此视图可以映射到系统支持的任何扩展机制。例如,在 Solaris 操作系统中,您可以使用此视图存储文件的 MIME 类型。

特定的文件系统实现可能仅支持基本文件属性视图,或者可能支持其中几个文件属性视图。文件系统实现可能支持此 API 中未包含的其他属性视图。

在大多数情况下,您不应直接处理任何 接口。(如果您确实需要直接使用 ,可以通过 方法访问它。)

方法使用泛型,可用于读取任何文件属性视图的属性。本页其余部分的示例使用 方法。

本节的其余部分涵盖以下主题:

  • 基本文件属性
  • 设置时间戳
  • DOS 文件属性
  • POSIX 文件权限
  • 设置文件或组所有者
  • 用户定义的文件属性
  • 文件存储属性

如前所述,要读取文件的基本属性,可以使用 方法之一,该方法一次性读取所有基本属性。这比单独访问文件系统以读取每个单独属性要高效得多。可变参数参数当前支持 枚举,。当您不希望跟随符号链接时,请使用此选项。


关于时间戳的说明:基本属性集包括三个时间戳:、和。 在特定实现中,这些时间戳中的任何一个可能不受支持,如果不支持,则相应的访问器方法返回一个特定于实现的值。 当支持时,时间戳作为对象返回。


以下代码片段读取并打印给定文件的基本文件属性,并使用类中的方法。

 

除了本示例中显示的访问器方法之外,还有一个方法,返回一个唯一标识文件的对象,如果没有文件键可用,则返回。

以下代码片段设置最后修改时间(以毫秒为单位):

讯享网

DOS 文件属性也受支持于除 DOS 外的其他文件系统,如 Samba。 以下代码片段使用类的方法。

 

但是,您可以使用方法设置 DOS 属性,如下所示:

讯享网

POSIX是 UNIX 可移植操作系统接口的缩写,是一组 IEEE 和 ISO 标准,旨在确保不同 UNIX 变种之间的互操作性。 如果程序符合这些 POSIX 标准,它应该很容易移植到其他符合 POSIX 标准的操作系统。

除了文件所有者和组所有者,POSIX 还支持九种文件权限:文件所有者、同一组成员和“其他所有人”的读取、写入和执行权限。

以下代码片段读取给定文件的 POSIX 文件属性,并将其打印到标准输出。 该代码使用类中的方法。

 

辅助类提供了几个有用的方法,如下所示:

  • 方法,在前面的代码片段中使用,将文件权限转换为字符串(例如,)。
  • 方法接受表示文件权限的字符串并构造一个文件权限的。
  • 方法接受一个文件权限的并构造一个可传递给或方法的文件属性。

以下代码片段从一个文件中读取属性并创建一个新文件,将原始文件的属性分配给新文件:

讯享网

方法将权限包装为。然后代码尝试使用这些权限创建一个新文件。请注意,也适用,因此新文件可能比请求的权限更安全。

要将文件的权限设置为表示为硬编码字符串的值,可以使用以下代码:

 

示例递归更改文件权限,类似于实用程序。

要将名称翻译为可存储为文件所有者或组所有者的对象,您可以使用服务。此服务查找一个字符串作为名称或组名称,并返回表示该字符串的对象。您可以通过使用方法获取默认文件系统的用户主体查找服务。

以下代码片段显示了如何使用方法设置文件所有者:

讯享网

类中没有专门用于设置组所有者的方法。但是,直接通过 POSIX 文件属性视图安全地执行此操作的方法如下:

 

如果您的文件系统实现支持的文件属性不足以满足您的需求,您可以使用来创建和跟踪自己的文件属性。

一些实现将这个概念映射到诸如 NTFS 替代数据流和文件系统(如 ext3 和 ZFS)上的扩展属性等功能。大多数实现对值的大小施加限制,例如,ext3 将大小限制为 4 千字节。

文件的 MIME 类型可以使用此代码片段存储为用户定义的属性:

讯享网

要读取 MIME 类型属性,您可以使用以下代码片段:

 

示例显示了如何获取、设置和删除用户定义的属性。


注意:在 Linux 中,您可能需要启用扩展属性才能使用户定义的属性起作用。如果尝试访问用户定义的属性视图时收到,则需要重新挂载文件系统。以下命令重新挂载具有 ext3 文件系统扩展属性的根分区。如果此命令对您的 Linux 版本不起作用,请参考文档。

讯享网

如果要使更改永久生效,请向添加条目。


您可以使用类来了解文件存储的信息,例如可用空间有多少。方法获取指定文件的文件存储。

以下代码片段打印了特定文件所在文件存储的空间使用情况:

 

示例使用此 API 打印默认文件系统中所有存储的磁盘空间信息。此示例使用类中的方法来获取文件系统的所有文件存储。

原文:

本页讨论了读取、写入、创建和打开文件的详细信息。有各种文件 I/O 方法可供选择。为了帮助理解 API,以下图表按复杂性排列了文件 I/O 方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传从简单到复杂排列的文件 I/O 方法

在图表的最左侧是实用方法、和方法,设计用于简单、常见情况。在这些方法的右侧是用于迭代流或文本行的方法,如、,然后是和。这些方法与包兼容。在这些方法的右侧是处理、和的方法,如方法。最后,在最右侧是使用进行文件锁定或内存映射 I/O 的高级应用的方法。


注意: 创建新文件的方法使您能够为文件指定一组可选的初始属性。例如,在支持 POSIX 标准集(如 UNIX)的文件系统上,您可以在创建文件时指定文件所有者、组所有者或文件权限。管理元数据页面解释了文件属性,以及如何访问和设置它们。


本页包含以下主题:

  • 打开选项
  • 小文件常用方法
  • 文本文件的缓冲 I/O 方法
  • 无缓冲流和与 API 兼容的方法
  • 通道和的方法
  • 创建常规和临时文件的方法

本节中的几种方法采用可选的参数。此参数是可选的,API 会告诉您当未指定时方法的默认行为是什么。

支持以下枚举:

  • – 打开文件以进行写访问。
  • – 将新数据追加到文件末尾。此选项与或选项一起使用。
  • – 将文件截断为零字节。此选项与选项一起使用。
  • – 创建新文件,并在文件已存在时抛出异常。
  • – 如果文件存在则打开文件,如果不存在则创建新文件。
  • – 在流关闭时删除文件。此选项对临时文件很有用。
  • – 暗示新创建的文件将是稀疏的。这个高级选项在一些文件系统上得到支持,比如 NTFS,在这些文件系统中,具有数据“间隙”的大文件可以以更有效的方式存储,其中这些空白间隙不会占用磁盘空间。
  • – 保持文件(内容和元数据)与底层存储设备同步。
  • – 保持文件内容与底层存储设备同步。

从文件中读取所有字节或行

如果您有一个相对较小的文件,并且希望一次读取其全部内容,您可以使用或方法。这些方法会为您处理大部分工作,比如打开和关闭流,但不适用于处理大文件。以下代码展示了如何使用方法:

讯享网

将所有字节或行写入文件

您可以使用其中一种写入方法将字节或行写入文件。

以下代码片段展示了如何使用方法。

 

包支持通道 I/O,它通过缓冲区传输数据,绕过了一些可能成为流 I/O 瓶颈的层。

使用缓冲流 I/O 读取文件

方法打开一个文件进行读取,返回一个,可用于以高效的方式从文件中读取文本。

以下代码片段展示了如何使用方法从文件中读取内容。该文件以"US-ASCII"编码。

讯享网

使用缓冲流 I/O 写入文件

您可以使用方法使用写入文件。

以下代码片段展示了如何使用这种方法创建一个以"US-ASCII"编码的文件:

 

使用流 I/O 读取文件

要打开文件进行读取,您可以使用方法。该方法返回一个用于从文件中读取字节的无缓冲输入流。

讯享网

通过流 I/O 创建和写入文件

您可以通过使用方法创建文件,追加到文件或向文件写入内容。该方法打开或创建一个文件以写入字节,并返回一个无缓冲的输出流。

该方法接受一个可选的参数。如果未指定任何打开选项,并且文件不存在,则会创建一个新文件。如果文件存在,则会被截断。此选项等同于使用和选项调用该方法。

以下示例打开一个日志文件。如果文件不存在,则会创建该文件。如果文件存在,则会以追加方式打开。

 

通过使用通道 I/O 读取和写入文件

流 I/O 每次读取一个字符,而通道 I/O 每次读取一个缓冲区。接口提供基本的和功能。是一个具有在通道中保持位置并更改该位置能力的。还支持截断与通道关联的文件并查询文件的大小。

在文件中移动到不同位置然后从该位置读取或写入使得文件的随机访问成为可能。查看随机访问文件获取更多信息。

有两种读取和写入通道 I/O 的方法。


注意: 方法返回一个的实例。对于默认文件系统,您可以将此可寻址字节通道转换为,从而提供对更高级功能的访问,例如将文件的某个区域直接映射到内存以实现更快的访问,锁定文件的某个区域以防其他进程访问,或者从绝对位置读取和写入字节而不影响通道的当前位置。


两个方法都允许你指定一系列选项。除了支持方法使用的相同打开选项外,还支持一个额外的选项:是必需的,因为支持读取和写入。

指定打开通道以进行读取。指定或打开通道以进行写入。如果没有指定这些选项中的任何一个,则通道将被打开以进行读取。

下面的代码片段读取一个文件并将其打印到标准输出:

讯享网

下面的示例是为 UNIX 和其他 POSIX 文件系统编写的,它创建了一个具有特定文件权限集的日志文件。这段代码将创建一个日志文件,如果该文件已经存在,则追加到日志文件中。该日志文件为所有者提供读写权限,为组提供只读权限。

 

创建文件

你可以使用方法创建一个具有初始属性集的空文件。例如,如果在创建时你想要文件具有特定的文件权限集,可以使用方法来实现。如果你没有指定任何属性,文件将使用默认属性创建。如果文件已经存在,会抛出异常。

在单个原子操作中,方法检查文件是否存在,并使用指定的属性创建该文件,这使得该过程更加安全,防止恶意代码。

下面的代码片段创建一个具有默认属性的文件:

讯享网

POSIX 文件权限有一个示例,使用创建一个具有预设权限的文件。

你也可以使用方法创建一个新文件,如使用流 I/O 创建和写入文件中所述。如果你打开一个新的输出流并立即关闭它,将会创建一个空文件。

创建临时文件

你可以使用以下方法之一创建一个临时文件:

第一种方法允许代码指定一个临时文件的目录,而第二种方法则在默认临时文件目录中创建一个新文件。这两种方法都允许你为文件名指定后缀,而第一种方法还允许你指定前缀。以下代码片段给出了第二种方法的示例:

 

运行此文件的结果将类似于以下内容:

讯享网

临时文件名的具体格式取决于平台。

原文:

随机访问文件允许对文件内容进行非顺序或随机访问。要随机访问文件,您需要打开文件,寻找特定位置,并从该位置读取或写入文件。

这种功能是通过接口实现的。接口扩展了通道 I/O 的概念,具有当前位置的概念。方法使您能够设置或查询位置,然后可以从该位置读取数据或将数据写入该位置。API 由一些易于使用的方法组成:

  • – 返回通道的当前位置
  • – 设置通道的位置
  • – 从通道读取字节到缓冲区
  • – 将缓冲区中的字节写入通道
  • – 截断与通道连接的文件(或其他实体)

使用通道 I/O 读写文件 显示方法返回的实例。在默认文件系统上,您可以直接使用该通道,或者将其转换为,从而可以访问更高级的功能,例如将文件的某个区域直接映射到内存以实现更快的访问,锁定文件的某个区域,或者从绝对位置读取和写入字节而不影响通道的当前位置。

以下代码片段通过使用方法打开文件进行读写。返回的被转换为。然后,从文件开头读取 12 个字节,并在该位置写入字符串"I was here!“。文件中的当前位置移动到末尾,并将开头的 12 个字节追加。最后,追加字符串"I was here!”,并关闭文件上的通道。

 

原文:

其中一些先前讨论过的方法,如,适用于文件、链接目录。但是如何列出文件系统顶部的所有目录?如何列出目录的内容或创建目录?

本节涵盖了以下特定于目录的功能:

  • 列出文件系统的根目录
  • 创建目录
  • 创建临时目录
  • 列出目录的内容
  • 通过使用 Globbing 筛选目录列表
  • 编写自己的目录过滤器

您可以使用方法列出文件系统的所有根目录。此方法返回一个,使您可以使用增强型 for 语句遍历所有根目录。

以下代码片段打印默认文件系统的根目录:

讯享网

您可以使用方法创建一个新目录。如果不指定任何,新目录将具有默认属性。例如:

 

以下代码片段在具有特定权限的 POSIX 文件系统上创建一个新目录:

讯享网

要在可能尚不存在一个或多个父目录的情况下创建几层深的目录,您可以使用方便的方法。与方法一样,您可以指定一组可选的初始文件属性。以下代码片段使用默认属性:

 

目录是按需自上而下创建的。在示例中,如果目录不存在,则会创建它。接下来,如果需要,将创建目录,最后创建目录。

在创建一些但不是所有父目录后,此方法可能会失败。

你可以使用方法之一创建临时目录:

第一个方法允许代码指定临时目录的位置,第二个方法在默认临时文件目录中创建一个新目录。

您可以使用方法列出目录的所有内容。此方法返回一个实现了接口的对象。实现接口的类还实现了,因此您可以遍历目录流,读取所有对象。这种方法适用于非常大的目录。


记住: 返回的是一个。如果你没有使用with-resources 语句,请不要忘记在块中关闭流。with-resources 语句会为您处理这个问题。


以下代码片段展示了如何打印目录的内容:

讯享网

迭代器返回的对象是相对于目录解析的条目名称。因此,如果您正在列出目录的内容,则条目将以、等形式返回。

此方法返回目录的全部内容:文件、链接、子目录和隐藏文件。如果您想更有选择地检索内容,可以使用本页后面描述的其他方法之一。

请注意,如果在目录迭代过程中出现异常,则会抛出,其原因是。迭代器方法不能抛出异常。

如果您只想获取文件和子目录,其中每个名称都匹配特定模式,可以使用方法,该方法提供了内置的 glob 过滤器。如果您不熟悉 glob 语法,请参阅什么是 Glob?

例如,以下代码片段列出了与 Java 相关的文件:.class.java和*.jar*文件。

 

也许您想要根据除了模式匹配之外的某些条件来过滤目录的内容。您可以通过实现接口来创建自己的过滤器。该接口由一个方法组成,用于确定文件是否满足搜索要求。

例如,以下代码片段实现了一个仅检索目录的过滤器:

讯享网

一旦过滤器被创建,就可以通过使用方法来调用它。以下代码片段使用过滤器仅将目录的子目录打印到标准输出:

 

此方法仅用于过滤单个目录。然而,如果您想要在文件树中找到所有子目录,您将使用遍历文件树的机制。

原文:

如前所述,包,特别是类是“链接感知”的。每个方法都会检测遇到符号链接时该做什么,或者提供一个选项,使您能够配置遇到符号链接时的行为。

到目前为止的讨论一直是关于符号或链接,但一些文件系统也支持硬链接。硬链接比符号链接更受限制,具体如下:

  • 链接的目标必须存在。
  • 通常不允许在目录上创建硬链接。
  • 硬链接不允许跨分区或卷。因此,它们不能存在于不同文件系统之间。
  • 一个硬链接看起来和行为都像一个普通文件,所以它们可能很难找到。
  • 从所有方面来看,硬链接与原始文件是相同的实体。它们具有相同的文件权限、时间戳等。所有属性都是相同的。

由于这些限制,硬链接不像符号链接那样经常使用,但方法与硬链接无缝配合。

有几种方法专门处理链接,并在以下部分中介绍:

  • 创建符号链接
  • 创建硬链接
  • 检测符号链接
  • 查找链接的目标

如果你的文件系统支持,你可以使用方法创建一个符号链接。第二个参数表示目标文件或目录,可能存在也可能不存在。以下代码片段创建了一个带有默认权限的符号链接:

讯享网

vararg 使您能够指定在创建链接时原子设置的初始文件属性。但是,这个参数是为将来使用而设计的,目前尚未实现。

你可以使用方法创建一个到现有文件的硬(或常规)链接。第二个参数定位现有文件,它必须存在,否则会抛出。以下代码片段展示了如何创建链接:

 

要确定实例是否是符号链接,可以使用方法。以下代码片段展示了如何:

讯享网

欲了解更多信息,请参阅管理元数据。

通过使用方法,您可以获取符号链接的目标,如下所示:

 

如果不是一个符号链接,该方法会抛出。

原文:

您是否需要创建一个应用程序,递归访问文件树中的所有文件?也许您需要删除树中的每个文件,或者找到在过去一年中未被访问的每个文件。您可以通过接口实现这一点。

本节涵盖以下内容:

  • FileVisitor 接口
  • 启动过程
  • 创建 FileVisitor 时的注意事项
  • 控制流程
  • 示例

要遍历文件树,首先需要实现一个。指定了在遍历过程的关键点上所需的行为:当访问文件时,在访问目录之前,在访问目录之后,或者当发生故障时。该接口有四个方法对应于这些情况:

  • – 在访问目录条目之前调用。
  • – 在访问目录中的所有条目之后调用。如果遇到任何错误,特定异常将传递给该方法。
  • – 在访问文件时调用。文件的被传递给该方法,或者您可以使用 file attributes 包来读取特定的属性集。例如,您可以选择读取文件的来确定文件是否设置了“hidden”位。
  • – 当无法访问文件时调用。特定异常被传递给该方法。您可以选择是否抛出异常,将其打印到控制台或日志文件等。

如果您不需要实现所有四个方法,而是扩展类,而不是实现接口。这个类实现了接口,访问树中的所有文件,并在遇到错误时抛出。您可以扩展这个类,并仅覆盖您需要的方法。

这是一个扩展以打印文件树中所有条目的示例。它打印条目,无论条目是常规文件、符号链接、目录还是其他类型的“未指定”文件。它还打印每个文件的字节大小。遇到的任何异常都会打印到控制台。

方法以粗体显示:

讯享网

一旦您实现了您的,如何启动文件遍历?类中有两个方法。

第一个方法只需要一个起始点和您的的实例。您可以按以下方式调用文件访问者:

 

第二个方法还允许您额外指定访问级别的限制和一组枚举。如果您希望确保此方法遍历整个文件树,您可以为最大深度参数指定。

您可以指定枚举,表示应该跟随符号链接。

此代码片段显示了如何调用四参数方法:

讯享网

文件树以深度优先方式遍历,但不能假设子目录的访问顺序。

如果您的程序将更改文件系统,您需要仔细考虑如何实现您的。

例如,如果您正在编写递归删除,您首先删除目录中的文件,然后再删除目录本身。在这种情况下,您在中删除目录。

如果您正在编写递归复制,您需要在中创建新目录,然后尝试将文件复制到其中(在中)。如果您想要保留源目录的属性(类似于 UNIX 的命令),您需要在文件被复制后,在中执行此操作。示例展示了如何做到这一点。

如果您正在编写文件搜索,您可以在方法中执行比较。此方法找到所有符合您条件的文件,但不会找到目录。如果您想要找到文件和目录,您还必须在或方法中执行比较。示例展示了如何做到这一点。

你需要决定是否要遵循符号链接。例如,如果你正在删除文件,跟随符号链接可能不明智。如果你正在复制文件树,你可能希望允许它。默认情况下,不会遵循符号链接。

对于文件,会调用方法。如果你指定了选项,并且你的文件树有一个指向父目录的循环链接,循环目录将在方法中报告,带有。以下代码片段显示了如何捕获循环链接,并来自于示例:

 

这种情况只会在程序遵循符号链接时发生。

也许你想要遍历文件树查找特定目录,并且在找到后希望进程终止。也许你想要跳过特定目录。

方法返回一个值。你可以通过在方法中返回的值来中止文件遍历过程或控制是否访问目录:

  • – 表示文件遍历应该继续。如果方法返回,则会访问该目录。
  • – 立即中止文件遍历。在返回此值后不会调用更多的文件遍历方法。
  • – 当返回此值时,指定的目录及其子目录将被跳过。这个分支将从树中“剪掉”。
  • – 当返回此值时,指定的目录不会被访问,不会被调用,也不会访问更多未访问的兄弟节点。如果从方法返回,不会访问更多的兄弟节点。基本上,在指定的目录中不会发生更多的事情。

在这段代码片段中,任何名为的目录都会被跳过:

讯享网

在这段代码片段中,一旦找到特定文件,文件名就会被打印到标准输出,并且文件遍历会终止:

 

以下示例演示了文件遍历机制:

  • – 递归查找符合特定通配符模式的文件和目录。此示例在查找文件中讨论。
  • – 递归更改文件树上的权限(仅适用于 POSIX 系统)。
  • – 递归复制文件树。
  • – 演示了监视目录中已创建、删除或修改的文件的机制。使用选项调用此程序会监视整个树的更改。有关文件通知服务的更多信息,请参见监视目录的更改。

原文:

如果你曾经使用过 shell 脚本,你很可能使用过模式匹配来定位文件。事实上,你可能已经广泛使用了它。如果你还没有使用过,模式匹配使用特殊字符创建模式,然后文件名可以与该模式进行比较。例如,在大多数 shell 脚本中,星号,,匹配任意数量的字符。例如,以下命令列出当前目录中以结尾的所有文件:

讯享网

包为这一有用功能提供了编程支持。每个文件系统实现都提供了一个。你可以通过在类中使用方法来检索文件系统的。以下代码片段获取默认文件系统的路径匹配器:

 

传递给的字符串参数指定语法风格和要匹配的模式。本示例指定了glob语法。如果你不熟悉 glob 语法,请参阅什么是 Glob。

Glob 语法易于使用和灵活,但如果你喜欢,也可以使用正则表达式,或regex语法。有关正则表达式的更多信息,请参阅正则表达式课程。一些文件系统实现可能支持其他语法。

如果你想使用其他形式的基于字符串的模式匹配,你可以创建自己的类。本页中的示例使用 glob 语法。

一旦你创建了实例,你就可以准备好根据它匹配文件。接口有一个方法,,它接受一个参数并返回一个布尔值:它要么匹配模式,要么不匹配。以下代码片段查找以或结尾的文件并将这些文件打印到标准输出:

讯享网

搜索与特定模式匹配的文件与遍历文件树密切相关。有多少次你知道一个文件在某处在文件系统上,但在哪里?或者也许你需要找到文件树中具有特定文件扩展名的所有文件。

示例正是如此。类似于 UNIX 的实用程序,但功能更简化。你可以扩展这个示例以包含其他功能。例如,实用程序支持标志来排除搜索中的整个子树。你可以通过在方法中返回来实现该功能。要实现选项,即跟随符号链接,你可以使用四个参数的方法,并传入枚举(但请确保在方法中测试循环链接)。

要运行 Find 应用程序,请使用以下格式:

 

模式被放置在引号内,以防止 shell 解释任何通配符。例如:

讯享网

这里是示例的源代码:

 

递归遍历文件树的内容在遍历文件树中有详细介绍。

原文:

你是否曾经发现自己正在编辑一个文件,使用 IDE 或另一个编辑器,并且出现一个对话框通知您文件系统中的一个打开文件已更改并需要重新加载?或者,就像 NetBeans IDE 一样,应用程序悄悄地更新文件而不通知您。以下示例对话框显示了使用免费编辑器jEdit时的通知外观:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传jEdit 对话框显示检测到修改的文件

要实现此功能,称为文件更改通知,程序必须能够检测到文件系统上相关目录发生的变化。一种方法是轮询文件系统以查找更改,但这种方法效率低下。它不适用于具有数百个打开文件或目录需要监视的应用程序。

包提供了一个文件更改通知 API,称为 Watch Service API。此 API 使您能够向观察服务注册目录(或目录)。在注册时,您告诉服务您感兴趣的事件类型:文件创建、文件删除或文件修改。当服务检测到感兴趣的事件时,它会转发给注册的进程。注册的进程有一个专用于监视其注册事件的线程(或线程池)。当事件发生时,根据需要进行处理。

本节涵盖以下内容:

  • 观察服务概述
  • 试一试
  • 创建 Watch Service 并注册事件
  • 处理事件
  • 获取文件名
  • 何时使用和不使用此 API

API 相当低级,允许您自定义它。您可以直接使用它,或者您可以选择在此机制之上创建一个高级 API,以使其适合您的特定需求。

下面是实现观察服务所需的基本步骤:

  • 为文件系统创建一个“观察者”。
  • 对于要监视的每个目录,请将其注册到观察者中。在注册目录时,指定要接收通知的事件类型。您为每个注册的目录收到一个实例。
  • 实现一个无限循环以等待传入事件。当事件发生时,键被标记并放入观察者队列中。
  • 从观察者队列中检索键。您可以从键中获取文件名。
  • 检索键的每个待处理事件(可能有多个事件)并根据需要处理。
  • 重置键,并恢复等待事件。
  • 关闭服务:当线程退出或调用其方法关闭服务时,监视服务将退出。

是线程安全的,可以与包一起使用。您可以为此目的专门分配一个线程池。

由于此 API 更为高级,请在继续之前先尝试一下。将示例保存到您的计算机上,并对其进行编译。创建一个将传递给示例的目录。使用单个线程处理所有事件,因此在等待事件时会阻止键盘输入。要么在单独的窗口中运行程序,要么在后台运行,如下所示:

讯享网

在目录中创建、删除和编辑文件。当发生任何这些事件时,将在控制台上打印消息。完成后,删除目录,退出。或者,如果您愿意,也可以手动终止进程。

您还可以通过指定选项来监视整个文件树。当您指定时,遍历文件树,将每个目录注册到监视服务中。

第一步是通过类中的方法创建一个新的,如下所示:

 

接下来,向监视服务注册一个或多个对象。任何实现了接口的对象都可以注册。类实现了接口,因此要监视的每个目录都被注册为一个对象。

与任何一样,类实现了两个方法。本页使用了两个参数版本的。(三个参数版本接受一个,目前尚未实现。)

在向监视服务注册对象时,您需要指定要监视的事件类型。支持的事件类型如下:

  • – 创建目录条目。
  • – 删除目录条目。
  • – 修改目录条目。
  • – 表示事件可能已丢失或被丢弃。您无需注册事件即可接收它。

以下代码片段显示了如何为所有三种事件类型注册实例:

讯享网

事件处理循环中事件的顺序如下:

  1. 获取一个监视键。提供了三种方法:
    • – 如果可用,则返回一个排队的键。如果不可用,则立即返回值。
    • – 如果有排队的键可用,则返回一个。如果没有立即可用的排队键,则程序将等待指定的时间。参数确定指定的时间是纳秒、毫秒还是其他时间单位。
    • – 返回一个排队的键。如果没有可用的排队键,此方法将等待。
  2. 处理键的待处理事件。您从方法中获取的。
  3. 使用方法检索事件的类型。无论键注册了什么事件,都有可能收到事件。您可以选择处理溢出或忽略它,但应该对其进行测试。
  4. 检索与事件关联的文件名。文件名存储为事件的上下文,因此使用方法来检索它。
  5. 处理键的事件后,需要通过调用将键放回状态。如果此方法返回,则键不再有效,循环可以退出。这一步非常重要。如果未调用,则此键将不会接收到进一步的事件。

观察键具有状态。在任何给定时间,其状态可能是以下之一:

  • 表示键已准备好接受事件。创建时,键处于准备状态。
  • 表示有一个或多个事件排队。一旦键被标记,它就不再处于准备状态,直到调用方法。
  • 表示键不再活动。当发生以下事件之一时,会出现此状态:
    • 进程通过使用方法显式取消键。
    • 目录变得无法访问。
    • 观察服务已经被关闭。

这里是一个事件处理循环的示例。它取自于 示例,该示例监视一个目录,等待新文件出现。当新文件可用时,通过使用 方法来检查它是否是一个 文件。意图是将 文件发送到一个别名,但具体实现细节留给读者。

Watch service API 特定的方法用粗体显示:

 

文件名是从事件上下文中检索的。 示例使用以下代码检索文件名:

讯享网

当你编译 示例时,会生成以下错误:

 

这个错误是由将 强制转换为 的代码行引起的。 示例通过创建一个抑制未经检查警告的实用 方法来避免这个错误,如下所示:

讯享网

如果你对 语法不熟悉,请参见 Annotations。

Watch Service API 适用于需要通知文件更改事件的应用程序。它非常适合任何可能有许多打开文件并需要确保文件与文件系统同步的应用程序,比如编辑器或 IDE。它也非常适合监视目录的应用服务器,也许等待 或 文件的出现,以便部署它们。

这个 API 是为了索引硬盘而设计的。大多数文件系统实现都原生支持文件更改通知。Watch Service API 利用了这种支持(如果可用)。然而,当文件系统不支持这种机制时,Watch Service 将轮询文件系统,等待事件发生。

原文:

本课程中未涵盖的一些有用方法在此处介绍。本节涵盖以下内容:

  • 确定 MIME 类型
  • 默认文件系统
  • 路径字符串分隔符
  • 文件系统的文件存储器

要确定文件的 MIME 类型,您可能会发现方法很有用。例如:

 

注意,如果无法确定内容类型,会返回 null。

此方法的实现高度依赖于平台,并不是绝对可靠的。内容类型由平台的默认文件类型检测器确定。例如,如果检测器根据扩展名确定文件的内容类型为,可能会被欺骗。

如果默认的方法不符合您的需求,您可以提供自定义的。

示例使用方法。

要检索默认文件系统,请使用方法。通常,此方法(注意是复数形式)链接到方法之一(注意是单数形式),如下所示:

讯享网

POSIX 文件系统的路径分隔符是正斜杠,Microsoft Windows 的路径分隔符是反斜杠。其他文件系统可能使用其他分隔符。要检索默认文件系统的分隔符,可以使用以下方法之一:

 

方法也用于检索任何可用文件系统的路径分隔符。

文件系统有一个或多个文件存储器来保存其文件和目录。文件存储器代表底层存储设备。在 UNIX 操作系统中,每个挂载的文件系统都由一个文件存储器表示。在 Microsoft Windows 中,每个卷都由一个文件存储器表示:、等等。

要检索文件系统的所有文件存储器列表,可以使用方法。此方法返回一个,允许您使用增强的 for 语句遍历所有根目录。

讯享网

如果要检索特定文件所在的文件存储器,请使用类中的方法,如下所示:

 

示例使用方法。

原文:

在 Java SE 7 发布之前, 类是文件 I/O 的机制,但它有一些缺点。

  • 许多方法在失败时不会抛出异常,因此无法获得有用的错误消息。例如,如果文件删除失败,程序将收到“删除失败”,但不知道是因为文件不存在、用户没有权限还是其他问题。
  • 方法在各个平台上的工作不一致。
  • 没有对符号链接的真正支持。
  • 需要更多对元数据的支持,如文件权限、文件所有者和其他安全属性。
  • 访问文件元数据效率低下。
  • 许多 方法不具备可扩展性。在服务器上请求大型目录列表可能导致挂起。大型目录也可能导致内存资源问题,导致拒绝服务。
  • 不可能编写可靠的代码,可以递归遍历文件树,并在存在循环符号链接时做出适当响应。

也许您有使用 的旧代码,并希望最小影响地利用 功能。

类提供了 方法,将旧式 实例转换为 实例,如下所示:

讯享网

然后,您可以利用 类提供的丰富功能集。

例如,假设您有一些删除文件的代码:

 

您可以修改此代码以使用 方法,如下所示:

讯享网

相反, 方法为 对象构造一个 对象。

由于 Java SE 7 发布中的文件 I/O 实现已完全重新架构,因此不能将一个方法替换为另一个方法。如果您想使用 包提供的丰富功能,最简单的解决方案是使用前一节中建议的 方法。但是,如果您不想使用该方法或该方法不符合您的需求,您必须重写文件 I/O 代码。

两个 API 之间没有一对一对应关系,但以下表格给出了 API 中的功能在 API 中的映射,并告诉您可以在哪里获取更多信息。

java.io.File 功能java.nio.file 功能教程覆盖范围Path 类 功能。随机访问文件、、、 和 。在 UNIX 文件系统上,使用 管理元数据(文件和文件存储属性) 包来检查九个文件权限。检查文件或目录 管理元数据、 和 、 和 管理元数据 和 和 管理元数据设置各种属性的 方法:、、、这些方法被 方法 替代。管理元数据路径操作移动文件或目录删除文件或目录创建文件由 方法中指定的 选项替代。创建文件

| | 、 | 创建文件 通过流 I/O 创建和写入文件

通过通道 I/O 读写文件 |

和 验证文件或目录的存在性 and and 比较两个路径 and 转换路径

| and | 或 | 转换路径 () 从路径中删除冗余部分 ()

|

转换路径检索路径信息 and 列出目录内容 和 创建目录列出文件系统的根目录、、、、、文件存储属性

小讯
上一篇 2025-06-03 12:49
下一篇 2025-05-31 09:52

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/142984.html