我有一个程序的输入预期有一个兽人的文件格式。我想能够检查提供的输入是否有效地是一个orc文件。仅检查扩展名是不够的,因为用户可以忽略扩展名。例如,对于parquet,我们可以检查第一行是否包含“par1”。兽人有没有一个等价的方法?
jum4pzuy1#
正如@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不会遍历整个文件。
vhmi4jdf2#
令人烦恼的是,他们有一个类似的东西Parquet文件与魔术字符串兽人,但它是在文件的结尾。https://orc.apache.org/specification/orcv0/在文件末尾之前完成一个字节的是postscript,postscript的最后三个字节是orc,所以你应该读取最后4个字节,应该是orc之类的。我会用十六进制编辑器来验证这个!
2条答案
按热度按时间jum4pzuy1#
正如@ed elliott所提到的,orc文件包含了尾部的信息。orc文件最后一个字节前的3个字节包含“orc”。以下是为我编写的代码:
值得一提的是,如果要读取的字节数是常量,那么读取的时间复杂度是o(1)。所以read不会遍历整个文件。
vhmi4jdf2#
令人烦恼的是,他们有一个类似的东西Parquet文件与魔术字符串兽人,但它是在文件的结尾。
https://orc.apache.org/specification/orcv0/
在文件末尾之前完成一个字节的是postscript,postscript的最后三个字节是orc,所以你应该读取最后4个字节,应该是orc之类的。
我会用十六进制编辑器来验证这个!