in src/main/java/org/apache/commons/io/input/XmlStreamReader.java [284:321]
private static String getXmlProlog(final InputStream inputStream, final String guessedEnc) throws IOException {
String encoding = null;
if (guessedEnc != null) {
final byte[] bytes = IOUtils.byteArray();
inputStream.mark(IOUtils.DEFAULT_BUFFER_SIZE);
int offset = 0;
int max = IOUtils.DEFAULT_BUFFER_SIZE;
int c = inputStream.read(bytes, offset, max);
int firstGT = -1;
String xmlProlog = ""; // avoid possible NPE warning (cannot happen; this just silences the warning)
while (c != -1 && firstGT == -1 && offset < IOUtils.DEFAULT_BUFFER_SIZE) {
offset += c;
max -= c;
c = inputStream.read(bytes, offset, max);
xmlProlog = new String(bytes, 0, offset, guessedEnc);
firstGT = xmlProlog.indexOf('>');
}
if (firstGT == -1) {
if (c == -1) {
throw new IOException("Unexpected end of XML stream");
}
throw new IOException("XML prolog or ROOT element not found on first " + offset + " bytes");
}
final int bytesRead = offset;
if (bytesRead > 0) {
inputStream.reset();
final BufferedReader bReader = new BufferedReader(new StringReader(xmlProlog.substring(0, firstGT + 1)));
final StringBuilder prolog = new StringBuilder();
IOConsumer.forEach(bReader.lines(), prolog::append);
final Matcher m = ENCODING_PATTERN.matcher(prolog);
if (m.find()) {
encoding = m.group(1).toUpperCase(Locale.ROOT);
encoding = encoding.substring(1, encoding.length() - 1);
}
}
}
return encoding;
}