检查文件是否为ORC文件

问题描述

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

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

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

ORC是否有等效的方法

解决方法

令人讨厌的是,它们与带有魔术字符串ORC的实木复合地板文件类似,但位于文件末尾。

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)。因此read不会遍历整个文件。