工作中遇到需要用poi解析导入的Excel文件的case,之前同事写的,我发现他做文件格式校验只是做了文件名后缀的解析。这样会有个问题,就是其他格式的文件是可以修改后缀的,这样就可以通过校验,做解析。虽然也有异常处理,但是我们无法定位到这是因为文件格式不对抛的异常。所以我在网上查了下,发现一个校验方法,就是通过魔数(Magic Number)。最著名的魔数就是平方根倒数算法,雷神之锤:
i = 0x5f3759df - ( i >> 1 );
我也不懂啥意思,先不管。我们平时写代码你在参数里突兀的直接用了字符串或者数字,编辑器提示你这是个魔法值,不规范。比如你算圆面积float r = 3.333; S=r^2*3.14;很明显这个3.14就是个魔数。但这些都跟我接下来写的东西没多少关系。
这里就不写原理了,网上有很多。我只贴出代码吧
util类:
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.util.Objects;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.poifs.filesystem.FileMagic;
@Slf4j
public class PoiReadUtil {
public static boolean isExcelFile(InputStream is) {
boolean result = false;
try {
FileMagic fileMagic = FileMagic.valueOf(new BufferedInputStream(is));
if (Objects.equals(fileMagic, FileMagic.OLE2)
|| Objects.equals(fileMagic, FileMagic.OOXML)) {
result = true;
}
} catch (Exception e) {
log.error("Exception when check the excel file:", e);
return false;
}
return result;
}
}
这篇写的有点水,不过测试过是可用的,像魔数这些概念,在.class字节码文件中也用到过。这里就不做深入探讨。