BomInputStreamReader.java

package de.siegmar.fastcsv.reader;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.Charset;

import de.siegmar.fastcsv.util.Nullable;

/// InputStreamReader that is capable of detecting and handling BOM headers.
final class BomInputStreamReader extends Reader {

    private final InputStream inputStream;
    private final Charset defaultCharset;

    @Nullable
    private Reader reader;

    BomInputStreamReader(final InputStream inputStream, final Charset defaultCharset) {
        this.inputStream = inputStream;
        this.defaultCharset = defaultCharset;
    }

    @SuppressWarnings("PMD.CloseResource")
    @Override
    public int read(final char[] cbuf, final int off, final int len) throws IOException {
        if (reader == null) {
            final var bomIn = new BomInputStream(inputStream, defaultCharset);
            reader = new InputStreamReader(bomIn, bomIn.getCharset());
        }

        return reader.read(cbuf, off, len);
    }

    @Override
    public void close() throws IOException {
        inputStream.close();
    }

}