在Java中,什么是"regular file"?

48

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

告诉文件是否为具有不透明内容的常规文件。

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

那么在 Java 中,什么是常规文件?


1
发现了这个问题,它更关注于不透明内容的部分。但似乎并没有完全回答你的问题。 - thegrinner
2
在*nix系统中,文件系统中还有设备节点、命名管道和本地套接字。也许这就是它所指的“其他”类型? - FatalError
@FatalError,那么这个术语只在*nix系统上相关,而不是像Windows这样的系统上? - Thunderforge
@Thunderforge 嗯,我不知道Windows上是否有这样的东西,但我不是Windows开发人员,所以不能确定。 - FatalError
什么是Java中的“常规文件”? - FrVaBe
@Thunderforge 我也不知道。有趣的问题,点赞! - FrVaBe
3个回答

26
例如在UNIX中,普通文件是指没有特殊属性的文件。特殊文件包括符号链接和目录。普通文件是一个存储在文件系统中的字节序列。
阅读UNIX和Linux stackexchange上的这个答案:What is a regular file? 引用块中的内容: 我认为rm-i是一个别名,可能是rm-i。 "正常"部分并没有特别的意义,它只意味着它不是管道、设备、套接字或任何其他"特殊"的东西。 这意味着该文件不是符号链接、管道、随机、空、cpu等等。也许你听说过Linux哲学:一切都是文本。这并不完全正确,但它暗示了一个支配操作上下文的场景,在这个场景中,可以直接将字符串处理工具应用于文件系统元素。在这种情况下,这更字面意义上的。要单独查看检测步骤,请尝试使用file命令,例如file /etc/passwd或file /dev/null。

2
这个术语是否也适用于Windows和其他平台? - Thunderforge
1
关于在Windows中的相关性,我相信NTFS文件系统实际上支持其自己的符号链接形式,您只需要一个特定的工具就能创建它们。 - Gimby
一些文件系统并非“永久性”的,例如tmpfs文件系统。事实上,唯一完全准确的区别是常规文件不是目录或某种“特殊”文件。Java只是试图描述主机操作系统的功能。 - Stephen C

11

来自AIX IBM文件参考

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

有三种类型的文件:

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

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

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

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

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

以上所有内容来自第一个链接。我在许多其它关于操作系统差异的资源中进行了检查,看起来这个定义在我找到的所有资源中都是最常见的。


1
这个答案不涵盖符号链接。它们将是一个特殊的文件。 - Engineer2021
这些术语是否也适用于Windows和其他平台? - Thunderforge
是的。正如我在答案底部所说,它适用于每个SO。 - Jorge Campos

8
我并非专家,但第一眼看上去,BasicFileAttributes不是一个类,而是一个接口。因此,常规文件是什么取决于该接口的实现。我可以看到,例如有一个实现了这个接口的类WindowsFileAttributs
如果你查看这个类的OpenJDK版本,你会发现它是...
!isSymbolicLink() && !isDirectory() && !isOther();

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接