检查文件是否为 ORC 文件

check if a file is an ORC file

我有一个程序,其输入应为 ORC 文件格式。

我希望能够检查提供的输入是否实际上是一个 ORC 文件。仅检查扩展名是不够的,因为用户可以省略扩展名。

例如,对于 Parquet,如果第一行包含“PAR1”,我们可以 check

ORC 有等效的方法吗?

令人恼火的是,它们与带有神奇字符串 ORC 的 parquet 文件有相似之处,但它位于文件末尾。

https://orc.apache.org/specification/ORCv0/

文件末尾前一个字节是Postscript,Postscript的最后三个字节是ORC所以你应该读最后4个字节应该是ORC什么的。

我会使用十六进制编辑器来验证这一点!

正如@Ed Elliott 所提到的,ORC 文件的尾部包含信息。 ORC 文件最后一个字节之前的 3 个字节包含“ORC”。这是为我做的代码:

val mainPath = Paths.get(new URI(path)).toString
val buffer = ByteBuffer.allocate(3)
val channel = FileChannel.open(Paths.get(mainPath), StandardOpenOption.READ)
channel.read(buffer, channel.size - 4)
new String(buffer.array(), StandardCharsets.UTF_8).equals("ORC")

值得一提的是,如果您要读取的字节数是恒定的,则此读取的时间复杂度为 O(1)。所以读取不会遍历整个文件。