On Fri, 27 Jun 2025 19:41:01 GMT, Brian Burkhalter <b...@openjdk.org> wrote:
>> Replaces the implementation `readAllCharsAsString().lines().toList()` with >> reading into a temporary `char` array which is then processed to detect line >> terminators and copy non-terminating characters into strings which are added >> to the list. > > Brian Burkhalter has updated the pull request incrementally with one > additional commit since the last revision: > > 8358533: Make no line terminator case clearer It seems the only additional info needed to handle resizing and line fragment preservation is the start position of the current line. We might be able to consolidate the two nested parsing loops into a single loop as well, which should improve/speed up the iteration performance. The PoC reference code below seems to work as expected, though not fully tested :-) public List<String> readAllLines() throws IOException { List<String> lines = new ArrayList<>(); char[] cb = new char[TRANSFER_BUFFER_SIZE]; int start = 0; int pos = 0; int limit = 0; boolean skipLF = false; int n; while ((n = read(cb, pos, cb.length - pos)) != -1) { limit = pos + n; while (pos < limit) { if (skipLF ) { if (cb[pos] == '\n') { pos++; start++; } skipLF = false; if (pos == limit) break; } char c = cb[pos++]; if (c == '\n' || c == '\r') { lines.add(new String(cb, start, pos - 1 - start)); skipLF = (c == '\r'); start = pos; } } int len = limit - start; if (len >= cb.length) { // allocate larger buffer and copy chars to beginning char[] tmp = new char[2*cb.length]; System.arraycopy(cb, start, tmp, 0, len); cb = tmp; } else if (start != 0 && len != 0) { // move fragment to beginning of buffer System.arraycopy(cb, start, cb, 0, len); } pos = limit = len; start = 0; } // add a string if EOS terminates the last line if (limit > start) lines.add(new String(cb, start, limit - start)); return Collections.unmodifiableList(lines); } ------------- PR Comment: https://git.openjdk.org/jdk/pull/25863#issuecomment-3015110296