in src/main/java/org/apache/commons/csv/CSVFormat.java [2358:2403]
private void printWithEscapes(final Reader reader, final Appendable appendable) throws IOException {
int start = 0;
int pos = 0;
@SuppressWarnings("resource") // Temp reader on input reader.
final ExtendedBufferedReader bufferedReader = new ExtendedBufferedReader(reader);
final char[] delimArray = getDelimiterCharArray();
final int delimLength = delimArray.length;
final char escape = getEscapeChar();
final StringBuilder builder = new StringBuilder(IOUtils.DEFAULT_BUFFER_SIZE);
int c;
final char[] lookAheadBuffer = new char[delimLength - 1];
while (EOF != (c = bufferedReader.read())) {
builder.append((char) c);
Arrays.fill(lookAheadBuffer, (char) 0);
bufferedReader.peek(lookAheadBuffer);
final String test = builder.toString() + new String(lookAheadBuffer);
final boolean isDelimiterStart = isDelimiter((char) c, test, pos, delimArray, delimLength);
final boolean isCr = c == Constants.CR;
final boolean isLf = c == Constants.LF;
if (isCr || isLf || c == escape || isDelimiterStart) {
// write out segment up until this char
if (pos > start) {
append(builder.substring(start, pos), appendable);
builder.setLength(0);
pos = -1;
}
if (isLf) {
c = 'n';
} else if (isCr) {
c = 'r';
}
escape((char) c, appendable);
if (isDelimiterStart) {
for (int i = 1; i < delimLength; i++) {
escape((char) bufferedReader.read(), appendable);
}
}
start = pos + 1; // start on the current char after this one
}
pos++;
}
// write last segment
if (pos > start) {
appendable.append(builder, start, pos);
}
}