什么是 Java 中的“常规文件”?

Posted

技术标签:

【中文标题】什么是 Java 中的“常规文件”?【英文标题】:What is a "regular file" in Java? 【发布时间】:2013-12-31 02:04:35 【问题描述】:

类BasicFileAttributes,用于检查文件系统中文件的属性,具有方法isRegularFile()。不幸的是,Javadoc 描述相当缺乏:

判断文件是否为内容不透明的常规文件。

这是什么意思?什么是内容不透明的常规文件?我可以从类中的其他方法中看出它不是目录或符号链接,所以我倾向于认为它是其他一切。但是,显然存在某种类型的“不规则文件”,因为存在一个名为 isOther() 的方法,如果它不是目录、符号链接或“常规文件”,则返回 true。

那么 Java 中的常规文件到底是什么?

【问题讨论】:

发现 this question 更关注不透明的内容部分。似乎没有回答你的整个问题。 在 *nix 系统上,文件系统中还有设备节点、fifo 和本地套接字。也许这就是它所指的那种“其他”? @FatalError,所以该术语仅适用于 *nix 系统,而不适用于 Windows 等系统? @Thunderforge 好吧,我不知道 Windows 上有什么,但我不是 Windows 开发人员,所以我不能肯定。 标题应该是“ ;-) 【参考方案1】:

例如,在 UNIX 中,常规文件在某些​​方面并不特殊。特殊文件包括符号链接和目录。常规文件是永久存储在文件系统中的字节序列。

阅读此答案@UNIX 和 Linux stackexchange:What is a regular file?

我认为 rm -i 是一个别名,可能是 rm -i。 “常规”部分没有 什么特别的意思,它只意味着它不是一个管道, 设备、插座或任何其他“特殊”。

表示该文件不是符号链接、管道、rand、null、cpu 等。 也许你听说过 linux 的哲学,一切都是文字。这 从字面上看不是真的,但它暗示了一个主导的操作环境 其中字符串处理工具可以应用于文件系统元素 直接地。在这种情况下,这意味着以更字面的方式。到 单独看检测步骤,试试命令文件,如file /etc/passwd 或文件 /dev/null。

【讨论】:

这个术语是否也适用于 Windows 和其他平台? 关于Windows中的相关性,我相信NTFS文件系统实际上支持自己的符号链接形式,你只需要一个特定的工具就可以创建它们。 有些文件系统不是“永久的”;例如一个 tmpfs 文件系统。事实上,唯一完全准确的区别是常规文件不是目录或某种“特殊”文件。 Java 只是试图描述宿主操作系统的特性。【参考方案2】:

我不是这方面的专家,但乍一看BasicFileAttributes 不是一个类,而是一个接口。因此,无论常规文件是什么,都取决于此接口的实现。我可以看到有例如实现此接口的类WindowsFileAttributs

如果你看看这个类的OpenJDK version你会发现它是

!isSymbolicLink() && !isDirectory() && !isOther();

从代码中获取所有其他信息 ;-)

【讨论】:

【参考方案3】:

来自Files Reference - AIX IBM

文件是可以读取或写入的数据集合。文件可以是您创建的程序、您编写的文本、您获取的数据或您使用的设备。命令、打印机、终端和应用程序都存储在文件中。这允许用户以统一的方式访问系统的不同元素,并为操作系统提供了极大的灵活性。创建文件时没有隐含格式。

文件分为三种类型

常规 - 存储数据(文本、二进制和可执行文件)。 目录 - 包含用于访问其他文件的信息。 特殊 - 定义 FIFO(先进先出)文件或物理设备。

常规文件是最常见的。当使用文字处理程序创建文档时,程序和文档都包含在常规文件中。

常规文件包含文本或二进制信息。用户可以阅读文本文件。计算机可以读取二进制文件。二进制文件可以是指示系统完成工作的可执行文件。命令、shell 脚本和其他程序存储在可执行文件中。

目录包含系统访问所有类型文件所需的信息,但它们不包含实际的文件数据。因此,目录占用的空间比普通文件少,并赋予文件系统结构灵活性和深度。每个目录条目代表一个文件或子目录,并包含文件的名称和文件的 i 节点(索引节点引用)编号。 i-node 编号表示描述与文件关联的数据的位置的唯一 i-node。目录由一组单独的命令创建和控制。有关详细信息,请参阅操作系统和设备管理中的“目录”。

特殊文件定义系统的设备或进程创建的临时文件。特殊文件分为三种基本类型:FIFO(先进先出)、块和字符。 FIFO 文件也称为管道。管道由一个进程创建,以暂时允许与另一个进程通信。当第一个进程完成时,这些文件将不复存在。块和字符文件定义设备。

以上所有内容均来自第一个链接。我检查了许多其他有关操作系统差异的来源,似乎这是我找到的所有来源中最常见的定义。

【讨论】:

这个答案不包括符号链接。这些将是一个特殊文件。 这些条款是否也适用于 Windows 和其他平台? 是的。正如我在答案底部所说,它适用于每个 SO。

以上是关于什么是 Java 中的“常规文件”?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查文件是否是C ++中的常规文件?

使用用户空间中的常规文件模仿 Linux 设备模型

如何将常规文件(例如 cwallet.sso )上传到 oracle db 中的 data_pump_dir?

通过 Windows 中的常规文件传输 1-2 兆字节的数据 - 是不是比通过 RAM 慢?

diff是啥意思

当 su 到 ssh 会话中的另一个用户时,Android 常规用户登录会丢失组信息