PushbackInputStream を使用する

以前、Excel 拡張子 (xls) (xlsx) 両方に対応した操作 Apache POI として、
oboe2uran.hatenablog.com
を書いた。

しかし、ファイルシステムによっては、Excel WorkBook の認識に、
Your InputStream was neither an OLE2 stream, nor an OOXML stream
or you haven't provide the poi-ooxml*.jar in the classpath/modulepath - FileMagic:

と、エラーになってしまうことがある。

どうも、POI の先読みの方法とPushBackInputStream の使い方が悪いように見える。
そこで、前のコンストラクタで InputStream を渡して Book を生成する部分を以下のように修正する。

public class ExcelWorker implements Closeable{
    private Workbook book;

    private static final int MAX_PATTERN_LENGTH = 44;

    public ExcelWorker(InputStream inst) throws EncryptedDocumentException, IOException {
        PushbackInputStream inp = new PushbackInputStream(inst, MAX_PATTERN_LENGTH);
        byte[] data = new byte[MAX_PATTERN_LENGTH];
        inp.read(data, 0, MAX_PATTERN_LENGTH);
        inp.unread(data);
        FileMagic fm = FileMagic.valueOf(data);
        if (FileMagic.OOXML==fm){
            book = new XSSFWorkbook(inp);
        }else if(FileMagic.OLE2==fm){
            book = new HSSFWorkbook(inp);
        }else {
            book = WorkbookFactory.create(inp);
        }
    }