Modified: 
websites/production/commons/content/proper/commons-csv/jacoco/org.apache.commons.csv/CSVFormat.java.html
==============================================================================
--- 
websites/production/commons/content/proper/commons-csv/jacoco/org.apache.commons.csv/CSVFormat.java.html
 (original)
+++ 
websites/production/commons/content/proper/commons-csv/jacoco/org.apache.commons.csv/CSVFormat.java.html
 Wed Mar 19 22:20:06 2025
@@ -43,6 +43,7 @@ import java.util.function.Supplier;
 
 import org.apache.commons.codec.binary.Base64OutputStream;
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.function.IOStream;
 import org.apache.commons.io.function.Uncheck;
 import org.apache.commons.io.output.AppendableOutputStream;
 
@@ -209,12 +210,12 @@ public final class CSVFormat implements
          */
         public static Builder create() {
             // @formatter:off
-<span class="fc" id="L212">            return new Builder()</span>
-<span class="fc" id="L213">                    
.setDelimiter(Constants.COMMA)</span>
-<span class="fc" id="L214">                    
.setQuote(Constants.DOUBLE_QUOTE_CHAR)</span>
-<span class="fc" id="L215">                    
.setRecordSeparator(Constants.CRLF)</span>
-<span class="fc" id="L216">                    
.setIgnoreEmptyLines(true)</span>
-<span class="fc" id="L217">                    
.setDuplicateHeaderMode(DuplicateHeaderMode.ALLOW_ALL);</span>
+<span class="fc" id="L213">            return new Builder()</span>
+<span class="fc" id="L214">                    
.setDelimiter(Constants.COMMA)</span>
+<span class="fc" id="L215">                    
.setQuote(Constants.DOUBLE_QUOTE_CHAR)</span>
+<span class="fc" id="L216">                    
.setRecordSeparator(Constants.CRLF)</span>
+<span class="fc" id="L217">                    
.setIgnoreEmptyLines(true)</span>
+<span class="fc" id="L218">                    
.setDuplicateHeaderMode(DuplicateHeaderMode.ALLOW_ALL);</span>
                     // @formatter:on
         }
 
@@ -225,7 +226,7 @@ public final class CSVFormat implements
          * @return a new builder.
          */
         public static Builder create(final CSVFormat csvFormat) {
-<span class="fc" id="L228">            return new Builder(csvFormat);</span>
+<span class="fc" id="L229">            return new Builder(csvFormat);</span>
         }
 
         private boolean allowMissingColumnNames;
@@ -270,33 +271,37 @@ public final class CSVFormat implements
 
         private boolean trim;
 
+        /** The maximum number of rows to process, excluding the header row. */
+        private long maxRows;
+
         private Builder() {
             // empty
         }
 
-<span class="fc" id="L277">        private Builder(final CSVFormat csvFormat) 
{</span>
-<span class="fc" id="L278">            this.delimiter = 
csvFormat.delimiter;</span>
-<span class="fc" id="L279">            this.quoteCharacter = 
csvFormat.quoteCharacter;</span>
-<span class="fc" id="L280">            this.quoteMode = 
csvFormat.quoteMode;</span>
-<span class="fc" id="L281">            this.commentMarker = 
csvFormat.commentMarker;</span>
-<span class="fc" id="L282">            this.escapeCharacter = 
csvFormat.escapeCharacter;</span>
-<span class="fc" id="L283">            this.ignoreSurroundingSpaces = 
csvFormat.ignoreSurroundingSpaces;</span>
-<span class="fc" id="L284">            this.allowMissingColumnNames = 
csvFormat.allowMissingColumnNames;</span>
-<span class="fc" id="L285">            this.ignoreEmptyLines = 
csvFormat.ignoreEmptyLines;</span>
-<span class="fc" id="L286">            this.recordSeparator = 
csvFormat.recordSeparator;</span>
-<span class="fc" id="L287">            this.nullString = 
csvFormat.nullString;</span>
+<span class="fc" id="L281">        private Builder(final CSVFormat csvFormat) 
{</span>
+<span class="fc" id="L282">            this.allowMissingColumnNames = 
csvFormat.allowMissingColumnNames;</span>
+<span class="fc" id="L283">            this.autoFlush = 
csvFormat.autoFlush;</span>
+<span class="fc" id="L284">            this.commentMarker = 
csvFormat.commentMarker;</span>
+<span class="fc" id="L285">            this.delimiter = 
csvFormat.delimiter;</span>
+<span class="fc" id="L286">            this.duplicateHeaderMode = 
csvFormat.duplicateHeaderMode;</span>
+<span class="fc" id="L287">            this.escapeCharacter = 
csvFormat.escapeCharacter;</span>
 <span class="fc" id="L288">            this.headerComments = 
csvFormat.headerComments;</span>
 <span class="fc" id="L289">            this.headers = csvFormat.headers;</span>
-<span class="fc" id="L290">            this.skipHeaderRecord = 
csvFormat.skipHeaderRecord;</span>
+<span class="fc" id="L290">            this.ignoreEmptyLines = 
csvFormat.ignoreEmptyLines;</span>
 <span class="fc" id="L291">            this.ignoreHeaderCase = 
csvFormat.ignoreHeaderCase;</span>
-<span class="fc" id="L292">            this.lenientEof = 
csvFormat.lenientEof;</span>
-<span class="fc" id="L293">            this.trailingData = 
csvFormat.trailingData;</span>
-<span class="fc" id="L294">            this.trailingDelimiter = 
csvFormat.trailingDelimiter;</span>
-<span class="fc" id="L295">            this.trim = csvFormat.trim;</span>
-<span class="fc" id="L296">            this.autoFlush = 
csvFormat.autoFlush;</span>
-<span class="fc" id="L297">            this.quotedNullString = 
csvFormat.quotedNullString;</span>
-<span class="fc" id="L298">            this.duplicateHeaderMode = 
csvFormat.duplicateHeaderMode;</span>
-<span class="fc" id="L299">        }</span>
+<span class="fc" id="L292">            this.ignoreSurroundingSpaces = 
csvFormat.ignoreSurroundingSpaces;</span>
+<span class="fc" id="L293">            this.lenientEof = 
csvFormat.lenientEof;</span>
+<span class="fc" id="L294">            this.maxRows = csvFormat.maxRows;</span>
+<span class="fc" id="L295">            this.nullString = 
csvFormat.nullString;</span>
+<span class="fc" id="L296">            this.quoteCharacter = 
csvFormat.quoteCharacter;</span>
+<span class="fc" id="L297">            this.quoteMode = 
csvFormat.quoteMode;</span>
+<span class="fc" id="L298">            this.quotedNullString = 
csvFormat.quotedNullString;</span>
+<span class="fc" id="L299">            this.recordSeparator = 
csvFormat.recordSeparator;</span>
+<span class="fc" id="L300">            this.skipHeaderRecord = 
csvFormat.skipHeaderRecord;</span>
+<span class="fc" id="L301">            this.trailingData = 
csvFormat.trailingData;</span>
+<span class="fc" id="L302">            this.trailingDelimiter = 
csvFormat.trailingDelimiter;</span>
+<span class="fc" id="L303">            this.trim = csvFormat.trim;</span>
+<span class="fc" id="L304">        }</span>
 
         /**
          * Builds a new CSVFormat instance.
@@ -306,7 +311,7 @@ public final class CSVFormat implements
          */
         @Deprecated
         public CSVFormat build() {
-<span class="fc" id="L309">            return get();</span>
+<span class="fc" id="L314">            return get();</span>
         }
 
         /**
@@ -317,7 +322,7 @@ public final class CSVFormat implements
          */
         @Override
         public CSVFormat get() {
-<span class="fc" id="L320">            return new CSVFormat(this);</span>
+<span class="fc" id="L325">            return new CSVFormat(this);</span>
         }
 
         /**
@@ -329,8 +334,8 @@ public final class CSVFormat implements
          */
         @Deprecated
         public Builder setAllowDuplicateHeaderNames(final boolean 
allowDuplicateHeaderNames) {
-<span class="fc bfc" id="L332" title="All 2 branches covered.">            
setDuplicateHeaderMode(allowDuplicateHeaderNames ? 
DuplicateHeaderMode.ALLOW_ALL : DuplicateHeaderMode.ALLOW_EMPTY);</span>
-<span class="fc" id="L333">            return this;</span>
+<span class="fc bfc" id="L337" title="All 2 branches covered.">            
setDuplicateHeaderMode(allowDuplicateHeaderNames ? 
DuplicateHeaderMode.ALLOW_ALL : DuplicateHeaderMode.ALLOW_EMPTY);</span>
+<span class="fc" id="L338">            return this;</span>
         }
 
         /**
@@ -342,8 +347,8 @@ public final class CSVFormat implements
          * @return This instance.
          */
         public Builder setAllowMissingColumnNames(final boolean 
allowMissingColumnNames) {
-<span class="fc" id="L345">            this.allowMissingColumnNames = 
allowMissingColumnNames;</span>
-<span class="fc" id="L346">            return this;</span>
+<span class="fc" id="L350">            this.allowMissingColumnNames = 
allowMissingColumnNames;</span>
+<span class="fc" id="L351">            return this;</span>
         }
 
         /**
@@ -353,8 +358,8 @@ public final class CSVFormat implements
          * @return This instance.
          */
         public Builder setAutoFlush(final boolean autoFlush) {
-<span class="fc" id="L356">            this.autoFlush = autoFlush;</span>
-<span class="fc" id="L357">            return this;</span>
+<span class="fc" id="L361">            this.autoFlush = autoFlush;</span>
+<span class="fc" id="L362">            return this;</span>
         }
 
         /**
@@ -392,8 +397,8 @@ public final class CSVFormat implements
          * @throws IllegalArgumentException thrown if the specified character 
is a line break
          */
         public Builder setCommentMarker(final char commentMarker) {
-<span class="fc" id="L395">            
setCommentMarker(Character.valueOf(commentMarker));</span>
-<span class="fc" id="L396">            return this;</span>
+<span class="fc" id="L400">            
setCommentMarker(Character.valueOf(commentMarker));</span>
+<span class="fc" id="L401">            return this;</span>
         }
 
         /**
@@ -431,11 +436,11 @@ public final class CSVFormat implements
          * @throws IllegalArgumentException thrown if the specified character 
is a line break
          */
         public Builder setCommentMarker(final Character commentMarker) {
-<span class="fc bfc" id="L434" title="All 2 branches covered.">            if 
(isLineBreak(commentMarker)) {</span>
-<span class="fc" id="L435">                throw new 
IllegalArgumentException(&quot;The comment start marker character cannot be a 
line break&quot;);</span>
+<span class="fc bfc" id="L439" title="All 2 branches covered.">            if 
(isLineBreak(commentMarker)) {</span>
+<span class="fc" id="L440">                throw new 
IllegalArgumentException(&quot;The comment start marker character cannot be a 
line break&quot;);</span>
             }
-<span class="fc" id="L437">            this.commentMarker = 
commentMarker;</span>
-<span class="fc" id="L438">            return this;</span>
+<span class="fc" id="L442">            this.commentMarker = 
commentMarker;</span>
+<span class="fc" id="L443">            return this;</span>
         }
 
         /**
@@ -445,7 +450,7 @@ public final class CSVFormat implements
          * @return This instance.
          */
         public Builder setDelimiter(final char delimiter) {
-<span class="fc" id="L448">            return 
setDelimiter(String.valueOf(delimiter));</span>
+<span class="fc" id="L453">            return 
setDelimiter(String.valueOf(delimiter));</span>
         }
 
         /**
@@ -455,14 +460,14 @@ public final class CSVFormat implements
          * @return This instance.
          */
         public Builder setDelimiter(final String delimiter) {
-<span class="fc bfc" id="L458" title="All 2 branches covered.">            if 
(containsLineBreak(delimiter)) {</span>
-<span class="fc" id="L459">                throw new 
IllegalArgumentException(&quot;The delimiter cannot be a line 
break&quot;);</span>
+<span class="fc bfc" id="L463" title="All 2 branches covered.">            if 
(containsLineBreak(delimiter)) {</span>
+<span class="fc" id="L464">                throw new 
IllegalArgumentException(&quot;The delimiter cannot be a line 
break&quot;);</span>
             }
-<span class="fc bfc" id="L461" title="All 2 branches covered.">            if 
(delimiter.isEmpty()) {</span>
-<span class="fc" id="L462">                throw new 
IllegalArgumentException(&quot;The delimiter cannot be empty&quot;);</span>
+<span class="fc bfc" id="L466" title="All 2 branches covered.">            if 
(delimiter.isEmpty()) {</span>
+<span class="fc" id="L467">                throw new 
IllegalArgumentException(&quot;The delimiter cannot be empty&quot;);</span>
             }
-<span class="fc" id="L464">            this.delimiter = delimiter;</span>
-<span class="fc" id="L465">            return this;</span>
+<span class="fc" id="L469">            this.delimiter = delimiter;</span>
+<span class="fc" id="L470">            return this;</span>
         }
 
         /**
@@ -473,8 +478,8 @@ public final class CSVFormat implements
          * @since 1.10.0
          */
         public Builder setDuplicateHeaderMode(final DuplicateHeaderMode 
duplicateHeaderMode) {
-<span class="fc" id="L476">            this.duplicateHeaderMode = 
Objects.requireNonNull(duplicateHeaderMode, 
&quot;duplicateHeaderMode&quot;);</span>
-<span class="fc" id="L477">            return this;</span>
+<span class="fc" id="L481">            this.duplicateHeaderMode = 
Objects.requireNonNull(duplicateHeaderMode, 
&quot;duplicateHeaderMode&quot;);</span>
+<span class="fc" id="L482">            return this;</span>
         }
 
         /**
@@ -485,8 +490,8 @@ public final class CSVFormat implements
          * @throws IllegalArgumentException thrown if the specified character 
is a line break
          */
         public Builder setEscape(final char escapeCharacter) {
-<span class="fc" id="L488">            
setEscape(Character.valueOf(escapeCharacter));</span>
-<span class="fc" id="L489">            return this;</span>
+<span class="fc" id="L493">            
setEscape(Character.valueOf(escapeCharacter));</span>
+<span class="fc" id="L494">            return this;</span>
         }
 
         /**
@@ -497,11 +502,11 @@ public final class CSVFormat implements
          * @throws IllegalArgumentException thrown if the specified character 
is a line break
          */
         public Builder setEscape(final Character escapeCharacter) {
-<span class="fc bfc" id="L500" title="All 2 branches covered.">            if 
(isLineBreak(escapeCharacter)) {</span>
-<span class="fc" id="L501">                throw new 
IllegalArgumentException(&quot;The escape character cannot be a line 
break&quot;);</span>
+<span class="fc bfc" id="L505" title="All 2 branches covered.">            if 
(isLineBreak(escapeCharacter)) {</span>
+<span class="fc" id="L506">                throw new 
IllegalArgumentException(&quot;The escape character cannot be a line 
break&quot;);</span>
             }
-<span class="fc" id="L503">            this.escapeCharacter = 
escapeCharacter;</span>
-<span class="fc" id="L504">            return this;</span>
+<span class="fc" id="L508">            this.escapeCharacter = 
escapeCharacter;</span>
+<span class="fc" id="L509">            return this;</span>
         }
 
         /**
@@ -526,13 +531,13 @@ public final class CSVFormat implements
          * @return This instance.
          */
         public Builder setHeader(final Class&lt;? extends Enum&lt;?&gt;&gt; 
headerEnum) {
-<span class="fc" id="L529">            String[] header = null;</span>
-<span class="fc bfc" id="L530" title="All 2 branches covered.">            if 
(headerEnum != null) {</span>
-<span class="fc" id="L531">                final Enum&lt;?&gt;[] enumValues = 
headerEnum.getEnumConstants();</span>
-<span class="fc" id="L532">                header = new 
String[enumValues.length];</span>
-<span class="fc" id="L533">                Arrays.setAll(header, i -&gt; 
enumValues[i].name());</span>
+<span class="fc" id="L534">            String[] header = null;</span>
+<span class="fc bfc" id="L535" title="All 2 branches covered.">            if 
(headerEnum != null) {</span>
+<span class="fc" id="L536">                final Enum&lt;?&gt;[] enumValues = 
headerEnum.getEnumConstants();</span>
+<span class="fc" id="L537">                header = new 
String[enumValues.length];</span>
+<span class="fc" id="L538">                Arrays.setAll(header, i -&gt; 
enumValues[i].name());</span>
             }
-<span class="fc" id="L535">            return setHeader(header);</span>
+<span class="fc" id="L540">            return setHeader(header);</span>
         }
 
         /**
@@ -556,7 +561,7 @@ public final class CSVFormat implements
          * @throws SQLException SQLException if a database access error occurs 
or this method is called on a closed result set.
          */
         public Builder setHeader(final ResultSet resultSet) throws 
SQLException {
-<span class="fc bfc" id="L559" title="All 2 branches covered.">            
return setHeader(resultSet != null ? resultSet.getMetaData() : null);</span>
+<span class="fc bfc" id="L564" title="All 2 branches covered.">            
return setHeader(resultSet != null ? resultSet.getMetaData() : null);</span>
         }
 
         /**
@@ -580,15 +585,15 @@ public final class CSVFormat implements
          * @throws SQLException SQLException if a database access error occurs 
or this method is called on a closed result set.
          */
         public Builder setHeader(final ResultSetMetaData resultSetMetaData) 
throws SQLException {
-<span class="fc" id="L583">            String[] labels = null;</span>
-<span class="fc bfc" id="L584" title="All 2 branches covered.">            if 
(resultSetMetaData != null) {</span>
-<span class="fc" id="L585">                final int columnCount = 
resultSetMetaData.getColumnCount();</span>
-<span class="fc" id="L586">                labels = new 
String[columnCount];</span>
-<span class="fc bfc" id="L587" title="All 2 branches covered.">                
for (int i = 0; i &lt; columnCount; i++) {</span>
-<span class="fc" id="L588">                    labels[i] = 
resultSetMetaData.getColumnLabel(i + 1);</span>
+<span class="fc" id="L588">            String[] labels = null;</span>
+<span class="fc bfc" id="L589" title="All 2 branches covered.">            if 
(resultSetMetaData != null) {</span>
+<span class="fc" id="L590">                final int columnCount = 
resultSetMetaData.getColumnCount();</span>
+<span class="fc" id="L591">                labels = new 
String[columnCount];</span>
+<span class="fc bfc" id="L592" title="All 2 branches covered.">                
for (int i = 0; i &lt; columnCount; i++) {</span>
+<span class="fc" id="L593">                    labels[i] = 
resultSetMetaData.getColumnLabel(i + 1);</span>
                 }
             }
-<span class="fc" id="L591">            return setHeader(labels);</span>
+<span class="fc" id="L596">            return setHeader(labels);</span>
         }
 
         /**
@@ -606,13 +611,15 @@ public final class CSVFormat implements
          * &lt;p&gt;
          * The header is also used by the {@link CSVPrinter}.
          * &lt;/p&gt;
-         *
+         * &lt;p&gt;
+         * This method keeps a copy of the input array.
+         * &lt;/p&gt;
          * @param header the header, {@code null} if disabled, empty if parsed 
automatically, user-specified otherwise.
          * @return This instance.
          */
         public Builder setHeader(final String... header) {
-<span class="fc" id="L614">            this.headers = 
CSVFormat.clone(header);</span>
-<span class="fc" id="L615">            return this;</span>
+<span class="fc" id="L621">            this.headers = 
CSVFormat.clone(header);</span>
+<span class="fc" id="L622">            return this;</span>
         }
 
         /**
@@ -644,13 +651,16 @@ public final class CSVFormat implements
          * # Generated by Apache Commons CSV.
          * # 1970-01-01T00:00:00Z
          * &lt;/pre&gt;
+         * &lt;p&gt;
+         * This method keeps a copy of the input array.
+         * &lt;/p&gt;
          *
          * @param headerComments the headerComments which will be printed by 
the Printer before the CSV data.
          * @return This instance.
          */
         public Builder setHeaderComments(final Object... headerComments) {
-<span class="fc" id="L652">            this.headerComments = 
CSVFormat.clone(toStringArray(headerComments));</span>
-<span class="fc" id="L653">            return this;</span>
+<span class="fc" id="L662">            this.headerComments = 
CSVFormat.clone(toStringArray(headerComments));</span>
+<span class="fc" id="L663">            return this;</span>
         }
 
         /**
@@ -682,13 +692,15 @@ public final class CSVFormat implements
          * # Generated by Apache Commons CSV.
          * # 1970-01-01T00:00:00Z
          * &lt;/pre&gt;
-         *
+         * &lt;p&gt;
+         * This method keeps a copy of the input array.
+         * &lt;/p&gt;
          * @param headerComments the headerComments which will be printed by 
the Printer before the CSV data.
          * @return This instance.
          */
         public Builder setHeaderComments(final String... headerComments) {
-<span class="fc" id="L690">            this.headerComments = 
CSVFormat.clone(headerComments);</span>
-<span class="fc" id="L691">            return this;</span>
+<span class="fc" id="L702">            this.headerComments = 
CSVFormat.clone(headerComments);</span>
+<span class="fc" id="L703">            return this;</span>
         }
 
         /**
@@ -700,8 +712,8 @@ public final class CSVFormat implements
          * @return This instance.
          */
         public Builder setIgnoreEmptyLines(final boolean ignoreEmptyLines) {
-<span class="fc" id="L703">            this.ignoreEmptyLines = 
ignoreEmptyLines;</span>
-<span class="fc" id="L704">            return this;</span>
+<span class="fc" id="L715">            this.ignoreEmptyLines = 
ignoreEmptyLines;</span>
+<span class="fc" id="L716">            return this;</span>
         }
 
         /**
@@ -711,8 +723,8 @@ public final class CSVFormat implements
          * @return This instance.
          */
         public Builder setIgnoreHeaderCase(final boolean ignoreHeaderCase) {
-<span class="fc" id="L714">            this.ignoreHeaderCase = 
ignoreHeaderCase;</span>
-<span class="fc" id="L715">            return this;</span>
+<span class="fc" id="L726">            this.ignoreHeaderCase = 
ignoreHeaderCase;</span>
+<span class="fc" id="L727">            return this;</span>
         }
 
         /**
@@ -722,8 +734,8 @@ public final class CSVFormat implements
          * @return This instance.
          */
         public Builder setIgnoreSurroundingSpaces(final boolean 
ignoreSurroundingSpaces) {
-<span class="fc" id="L725">            this.ignoreSurroundingSpaces = 
ignoreSurroundingSpaces;</span>
-<span class="fc" id="L726">            return this;</span>
+<span class="fc" id="L737">            this.ignoreSurroundingSpaces = 
ignoreSurroundingSpaces;</span>
+<span class="fc" id="L738">            return this;</span>
         }
 
         /**
@@ -734,8 +746,23 @@ public final class CSVFormat implements
          * @since 1.11.0
          */
         public Builder setLenientEof(final boolean lenientEof) {
-<span class="fc" id="L737">            this.lenientEof = lenientEof;</span>
-<span class="fc" id="L738">            return this;</span>
+<span class="fc" id="L749">            this.lenientEof = lenientEof;</span>
+<span class="fc" id="L750">            return this;</span>
+        }
+
+        /**
+         * Sets the maximum number of rows to process, excluding the header 
row.
+         * &lt;p&gt;
+         * Values less than or equal to 0 mean no limit.
+         * &lt;/p&gt;
+         *
+         * @param maxRows the maximum number of rows to process, excluding the 
header row.
+         * @return This instance.
+         * @since 1.14.0
+         */
+        public Builder setMaxRows(final long maxRows) {
+<span class="fc" id="L764">            this.maxRows = maxRows;</span>
+<span class="fc" id="L765">            return this;</span>
         }
 
         /**
@@ -750,9 +777,9 @@ public final class CSVFormat implements
          * @return This instance.
          */
         public Builder setNullString(final String nullString) {
-<span class="fc" id="L753">            this.nullString = nullString;</span>
-<span class="fc" id="L754">            this.quotedNullString = quoteCharacter 
+ nullString + quoteCharacter;</span>
-<span class="fc" id="L755">            return this;</span>
+<span class="fc" id="L780">            this.nullString = nullString;</span>
+<span class="fc" id="L781">            this.quotedNullString = quoteCharacter 
+ nullString + quoteCharacter;</span>
+<span class="fc" id="L782">            return this;</span>
         }
 
         /**
@@ -762,8 +789,8 @@ public final class CSVFormat implements
          * @return This instance.
          */
         public Builder setQuote(final char quoteCharacter) {
-<span class="fc" id="L765">            
setQuote(Character.valueOf(quoteCharacter));</span>
-<span class="fc" id="L766">            return this;</span>
+<span class="fc" id="L792">            
setQuote(Character.valueOf(quoteCharacter));</span>
+<span class="fc" id="L793">            return this;</span>
         }
 
         /**
@@ -773,11 +800,11 @@ public final class CSVFormat implements
          * @return This instance.
          */
         public Builder setQuote(final Character quoteCharacter) {
-<span class="fc bfc" id="L776" title="All 2 branches covered.">            if 
(isLineBreak(quoteCharacter)) {</span>
-<span class="fc" id="L777">                throw new 
IllegalArgumentException(&quot;The quoteCharacter cannot be a line 
break&quot;);</span>
+<span class="fc bfc" id="L803" title="All 2 branches covered.">            if 
(isLineBreak(quoteCharacter)) {</span>
+<span class="fc" id="L804">                throw new 
IllegalArgumentException(&quot;The quoteCharacter cannot be a line 
break&quot;);</span>
             }
-<span class="fc" id="L779">            this.quoteCharacter = 
quoteCharacter;</span>
-<span class="fc" id="L780">            return this;</span>
+<span class="fc" id="L806">            this.quoteCharacter = 
quoteCharacter;</span>
+<span class="fc" id="L807">            return this;</span>
         }
 
         /**
@@ -787,8 +814,8 @@ public final class CSVFormat implements
          * @return This instance.
          */
         public Builder setQuoteMode(final QuoteMode quoteMode) {
-<span class="fc" id="L790">            this.quoteMode = quoteMode;</span>
-<span class="fc" id="L791">            return this;</span>
+<span class="fc" id="L817">            this.quoteMode = quoteMode;</span>
+<span class="fc" id="L818">            return this;</span>
         }
 
         /**
@@ -803,8 +830,8 @@ public final class CSVFormat implements
          * @return This instance.
          */
         public Builder setRecordSeparator(final char recordSeparator) {
-<span class="fc" id="L806">            this.recordSeparator = 
String.valueOf(recordSeparator);</span>
-<span class="fc" id="L807">            return this;</span>
+<span class="fc" id="L833">            this.recordSeparator = 
String.valueOf(recordSeparator);</span>
+<span class="fc" id="L834">            return this;</span>
         }
 
         /**
@@ -819,8 +846,8 @@ public final class CSVFormat implements
          * @return This instance.
          */
         public Builder setRecordSeparator(final String recordSeparator) {
-<span class="fc" id="L822">            this.recordSeparator = 
recordSeparator;</span>
-<span class="fc" id="L823">            return this;</span>
+<span class="fc" id="L849">            this.recordSeparator = 
recordSeparator;</span>
+<span class="fc" id="L850">            return this;</span>
         }
 
         /**
@@ -830,8 +857,8 @@ public final class CSVFormat implements
          * @return This instance.
          */
         public Builder setSkipHeaderRecord(final boolean skipHeaderRecord) {
-<span class="fc" id="L833">            this.skipHeaderRecord = 
skipHeaderRecord;</span>
-<span class="fc" id="L834">            return this;</span>
+<span class="fc" id="L860">            this.skipHeaderRecord = 
skipHeaderRecord;</span>
+<span class="fc" id="L861">            return this;</span>
         }
 
         /**
@@ -842,8 +869,8 @@ public final class CSVFormat implements
          * @since 1.11.0
          */
         public Builder setTrailingData(final boolean trailingData) {
-<span class="fc" id="L845">            this.trailingData = trailingData;</span>
-<span class="fc" id="L846">            return this;</span>
+<span class="fc" id="L872">            this.trailingData = trailingData;</span>
+<span class="fc" id="L873">            return this;</span>
         }
 
         /**
@@ -853,10 +880,11 @@ public final class CSVFormat implements
          * @return This instance.
          */
         public Builder setTrailingDelimiter(final boolean trailingDelimiter) {
-<span class="fc" id="L856">            this.trailingDelimiter = 
trailingDelimiter;</span>
-<span class="fc" id="L857">            return this;</span>
+<span class="fc" id="L883">            this.trailingDelimiter = 
trailingDelimiter;</span>
+<span class="fc" id="L884">            return this;</span>
         }
 
+
         /**
          * Sets whether to trim leading and trailing blanks.
          *
@@ -864,8 +892,8 @@ public final class CSVFormat implements
          * @return This instance.
          */
         public Builder setTrim(final boolean trim) {
-<span class="fc" id="L867">            this.trim = trim;</span>
-<span class="fc" id="L868">            return this;</span>
+<span class="fc" id="L895">            this.trim = trim;</span>
+<span class="fc" id="L896">            return this;</span>
         }
     }
 
@@ -874,21 +902,21 @@ public final class CSVFormat implements
      *
      * @since 1.2
      */
-<span class="fc" id="L877">    public enum Predefined {</span>
+<span class="fc" id="L905">    public enum Predefined {</span>
 
         /**
          * The DEFAULT predefined format.
          *
          * @see CSVFormat#DEFAULT
          */
-<span class="fc" id="L884">        Default(DEFAULT),</span>
+<span class="fc" id="L912">        Default(DEFAULT),</span>
 
         /**
          * The EXCEL predefined format.
          *
          * @see CSVFormat#EXCEL
          */
-<span class="fc" id="L891">        Excel(EXCEL),</span>
+<span class="fc" id="L919">        Excel(EXCEL),</span>
 
         /**
          * The INFORMIX_UNLOAD predefined format.
@@ -896,7 +924,7 @@ public final class CSVFormat implements
          * @see CSVFormat#INFORMIX_UNLOAD
          * @since 1.3
          */
-<span class="fc" id="L899">        InformixUnload(INFORMIX_UNLOAD),</span>
+<span class="fc" id="L927">        InformixUnload(INFORMIX_UNLOAD),</span>
 
         /**
          * The INFORMIX_UNLOAD_CSV predefined format.
@@ -904,7 +932,7 @@ public final class CSVFormat implements
          * @see CSVFormat#INFORMIX_UNLOAD_CSV
          * @since 1.3
          */
-<span class="fc" id="L907">        
InformixUnloadCsv(INFORMIX_UNLOAD_CSV),</span>
+<span class="fc" id="L935">        
InformixUnloadCsv(INFORMIX_UNLOAD_CSV),</span>
 
         /**
          * The MONGODB_CSV predefined format.
@@ -912,7 +940,7 @@ public final class CSVFormat implements
          * @see CSVFormat#MONGODB_CSV
          * @since 1.7
          */
-<span class="fc" id="L915">        MongoDBCsv(MONGODB_CSV),</span>
+<span class="fc" id="L943">        MongoDBCsv(MONGODB_CSV),</span>
 
         /**
          * The MONGODB_TSV predefined format.
@@ -920,21 +948,21 @@ public final class CSVFormat implements
          * @see CSVFormat#MONGODB_TSV
          * @since 1.7
          */
-<span class="fc" id="L923">        MongoDBTsv(MONGODB_TSV),</span>
+<span class="fc" id="L951">        MongoDBTsv(MONGODB_TSV),</span>
 
         /**
          * The MYSQL predefined format.
          *
          * @see CSVFormat#MYSQL
          */
-<span class="fc" id="L930">        MySQL(MYSQL),</span>
+<span class="fc" id="L958">        MySQL(MYSQL),</span>
 
         /**
          * The ORACLE predefined format.
          *
          * @see CSVFormat#ORACLE
          */
-<span class="fc" id="L937">        Oracle(ORACLE),</span>
+<span class="fc" id="L965">        Oracle(ORACLE),</span>
 
         /**
          * The POSTGRESQL_CSV predefined format.
@@ -942,34 +970,34 @@ public final class CSVFormat implements
          * @see CSVFormat#POSTGRESQL_CSV
          * @since 1.5
          */
-<span class="fc" id="L945">        PostgreSQLCsv(POSTGRESQL_CSV),</span>
+<span class="fc" id="L973">        PostgreSQLCsv(POSTGRESQL_CSV),</span>
 
         /**
          * The POSTGRESQL_TEXT predefined format.
          *
          * @see CSVFormat#POSTGRESQL_TEXT
          */
-<span class="fc" id="L952">        PostgreSQLText(POSTGRESQL_TEXT),</span>
+<span class="fc" id="L980">        PostgreSQLText(POSTGRESQL_TEXT),</span>
 
         /**
          * The RFC4180 predefined format.
          *
          * @see CSVFormat#RFC4180
          */
-<span class="fc" id="L959">        RFC4180(CSVFormat.RFC4180),</span>
+<span class="fc" id="L987">        RFC4180(CSVFormat.RFC4180),</span>
 
         /**
          * The TDF predefined format.
          *
          * @see CSVFormat#TDF
          */
-<span class="fc" id="L966">        TDF(CSVFormat.TDF);</span>
+<span class="fc" id="L994">        TDF(CSVFormat.TDF);</span>
 
         private final CSVFormat format;
 
-<span class="fc" id="L970">        Predefined(final CSVFormat format) {</span>
-<span class="fc" id="L971">            this.format = format;</span>
-<span class="fc" id="L972">        }</span>
+<span class="fc" id="L998">        Predefined(final CSVFormat format) {</span>
+<span class="fc" id="L999">            this.format = format;</span>
+<span class="fc" id="L1000">        }</span>
 
         /**
          * Gets the format.
@@ -977,7 +1005,7 @@ public final class CSVFormat implements
          * @return the format.
          */
         public CSVFormat getFormat() {
-<span class="fc" id="L980">            return format;</span>
+<span class="fc" id="L1008">            return format;</span>
         }
     }
 
@@ -998,18 +1026,19 @@ public final class CSVFormat implements
      * @see Predefined#Default
      * @see DuplicateHeaderMode#ALLOW_ALL
      */
-<span class="fc" id="L1001">    public static final CSVFormat DEFAULT = new 
CSVFormat(Builder.create());</span>
+<span class="fc" id="L1029">    public static final CSVFormat DEFAULT = new 
CSVFormat(Builder.create());</span>
 
     /**
-     * Excel file format (using a comma as the value delimiter). Note that the 
actual value delimiter used by Excel is locale-dependent, it might be necessary
-     * to customize this format to accommodate your regional settings.
+     * &lt;a 
href=&quot;https://support.microsoft.com/en-us/office/import-or-export-text-txt-or-csv-files-5250ac4c-663c-47ce-937b-339e391393ba&quot;&gt;Microsoft
 Excel&lt;/a&gt; file
+     * format (using a comma as the value delimiter). Note that the actual 
value delimiter used by Excel is locale-dependent, it might be necessary to 
customize
+     * this format to accommodate your regional settings.
      *
      * &lt;p&gt;
      * For example for parsing or generating a CSV file on a French system the 
following format will be used:
      * &lt;/p&gt;
      *
      * &lt;pre&gt;
-     * CSVFormat fmt = CSVFormat.EXCEL.builder().setDelimiter(';').get();
+     * CSVFormat format = CSVFormat.EXCEL.builder().setDelimiter(';').get();
      * &lt;/pre&gt;
      *
      * &lt;p&gt;
@@ -1032,18 +1061,21 @@ public final class CSVFormat implements
      *
      * @see Predefined#Excel
      * @see DuplicateHeaderMode#ALLOW_ALL
+     * @see &lt;a 
href=&quot;https://support.microsoft.com/en-us/office/import-or-export-text-txt-or-csv-files-5250ac4c-663c-47ce-937b-339e391393ba&quot;&gt;Microsoft
 Excel
+     *      &lt;/a&gt;
      */
     // @formatter:off
-<span class="fc" id="L1037">    public static final CSVFormat EXCEL = 
DEFAULT.builder()</span>
-<span class="fc" id="L1038">            .setIgnoreEmptyLines(false)</span>
-<span class="fc" id="L1039">            
.setAllowMissingColumnNames(true)</span>
-<span class="fc" id="L1040">            .setTrailingData(true)</span>
-<span class="fc" id="L1041">            .setLenientEof(true)</span>
-<span class="fc" id="L1042">            .get();</span>
+<span class="fc" id="L1068">    public static final CSVFormat EXCEL = 
DEFAULT.builder()</span>
+<span class="fc" id="L1069">            .setIgnoreEmptyLines(false)</span>
+<span class="fc" id="L1070">            
.setAllowMissingColumnNames(true)</span>
+<span class="fc" id="L1071">            .setTrailingData(true)</span>
+<span class="fc" id="L1072">            .setLenientEof(true)</span>
+<span class="fc" id="L1073">            .get();</span>
     // @formatter:on
 
     /**
-     * Default Informix CSV UNLOAD format used by the {@code UNLOAD TO 
file_name} operation.
+     * Default &lt;a 
href=&quot;https://www.ibm.com/docs/en/informix-servers/14.10?topic=statements-unload-statement&quot;&gt;Informix
 CSV UNLOAD&lt;/a&gt;
+     * format used by the {@code UNLOAD TO file_name} operation.
      *
      * &lt;p&gt;
      * This is a comma-delimited format with an LF character as the line 
separator. Values are not quoted and special characters are escaped with {@code 
'\'}.
@@ -1061,21 +1093,21 @@ public final class CSVFormat implements
      * &lt;/ul&gt;
      *
      * @see Predefined#MySQL
-     * @see &lt;a href= 
&quot;http://www.ibm.com/support/knowledgecenter/SSBJG3_2.5.0/com.ibm.gen_busug.doc/c_fgl_InOutSql_UNLOAD.htm&quot;&gt;
-     *      
http://www.ibm.com/support/knowledgecenter/SSBJG3_2.5.0/com.ibm.gen_busug.doc/c_fgl_InOutSql_UNLOAD.htm&lt;/a&gt;
+     * @see &lt;a 
href=&quot;https://www.ibm.com/docs/en/informix-servers/14.10?topic=statements-unload-statement&quot;&gt;Informix
 CSV UNLOAD&lt;/a&gt;
      * @since 1.3
      */
     // @formatter:off
-<span class="fc" id="L1069">    public static final CSVFormat INFORMIX_UNLOAD 
= DEFAULT.builder()</span>
-<span class="fc" id="L1070">            .setDelimiter(Constants.PIPE)</span>
-<span class="fc" id="L1071">            .setEscape(Constants.BACKSLASH)</span>
-<span class="fc" id="L1072">            
.setQuote(Constants.DOUBLE_QUOTE_CHAR)</span>
-<span class="fc" id="L1073">            
.setRecordSeparator(Constants.LF)</span>
-<span class="fc" id="L1074">            .get();</span>
+<span class="fc" id="L1100">    public static final CSVFormat INFORMIX_UNLOAD 
= DEFAULT.builder()</span>
+<span class="fc" id="L1101">            .setDelimiter(Constants.PIPE)</span>
+<span class="fc" id="L1102">            .setEscape(Constants.BACKSLASH)</span>
+<span class="fc" id="L1103">            
.setQuote(Constants.DOUBLE_QUOTE_CHAR)</span>
+<span class="fc" id="L1104">            
.setRecordSeparator(Constants.LF)</span>
+<span class="fc" id="L1105">            .get();</span>
     // @formatter:on
 
     /**
-     * Default Informix CSV UNLOAD format used by the {@code UNLOAD TO 
file_name} operation (escaping is disabled.)
+     * Default &lt;a 
href=&quot;https://www.ibm.com/docs/en/informix-servers/14.10?topic=statements-unload-statement&quot;&gt;Informix
 CSV UNLOAD&lt;/a&gt;
+     * format used by the {@code UNLOAD TO file_name} operation (escaping is 
disabled.)
      *
      * &lt;p&gt;
      * This is a comma-delimited format with an LF character as the line 
separator. Values are not quoted and special characters are escaped with {@code 
'\'}.
@@ -1097,11 +1129,11 @@ public final class CSVFormat implements
      * @since 1.3
      */
     // @formatter:off
-<span class="fc" id="L1100">    public static final CSVFormat 
INFORMIX_UNLOAD_CSV = DEFAULT.builder()</span>
-<span class="fc" id="L1101">            .setDelimiter(Constants.COMMA)</span>
-<span class="fc" id="L1102">            
.setQuote(Constants.DOUBLE_QUOTE_CHAR)</span>
-<span class="fc" id="L1103">            
.setRecordSeparator(Constants.LF)</span>
-<span class="fc" id="L1104">            .get();</span>
+<span class="fc" id="L1132">    public static final CSVFormat 
INFORMIX_UNLOAD_CSV = DEFAULT.builder()</span>
+<span class="fc" id="L1133">            .setDelimiter(Constants.COMMA)</span>
+<span class="fc" id="L1134">            
.setQuote(Constants.DOUBLE_QUOTE_CHAR)</span>
+<span class="fc" id="L1135">            
.setRecordSeparator(Constants.LF)</span>
+<span class="fc" id="L1136">            .get();</span>
     // @formatter:on
 
     /**
@@ -1127,7 +1159,7 @@ public final class CSVFormat implements
      * &lt;li&gt;{@link Builder#setDelimiter(char) setDelimiter}{@code 
(',')}&lt;/li&gt;
      * &lt;li&gt;{@link Builder#setEscape(char) setEscape}{@code 
('&quot;')}&lt;/li&gt;
      * &lt;li&gt;{@link Builder#setQuote(char) setQuote}{@code 
('&quot;')}&lt;/li&gt;
-     * &lt;li&gt;{@link Builder#setQuoteMode(QuoteMode) setQuoteMode}{@code 
(QuoteMode.ALL_NON_NULL)}&lt;/li&gt;
+     * &lt;li&gt;{@link Builder#setQuoteMode(QuoteMode) setQuoteMode}{@code 
(QuoteMode.MINIMAL)}&lt;/li&gt;
      * &lt;/ul&gt;
      *
      * @see Predefined#MongoDBCsv
@@ -1136,12 +1168,12 @@ public final class CSVFormat implements
      * @since 1.7
      */
     // @formatter:off
-<span class="fc" id="L1139">    public static final CSVFormat MONGODB_CSV = 
DEFAULT.builder()</span>
-<span class="fc" id="L1140">            .setDelimiter(Constants.COMMA)</span>
-<span class="fc" id="L1141">            
.setEscape(Constants.DOUBLE_QUOTE_CHAR)</span>
-<span class="fc" id="L1142">            
.setQuote(Constants.DOUBLE_QUOTE_CHAR)</span>
-<span class="fc" id="L1143">            .setQuoteMode(QuoteMode.MINIMAL)</span>
-<span class="fc" id="L1144">            .get();</span>
+<span class="fc" id="L1171">    public static final CSVFormat MONGODB_CSV = 
DEFAULT.builder()</span>
+<span class="fc" id="L1172">            .setDelimiter(Constants.COMMA)</span>
+<span class="fc" id="L1173">            
.setEscape(Constants.DOUBLE_QUOTE_CHAR)</span>
+<span class="fc" id="L1174">            
.setQuote(Constants.DOUBLE_QUOTE_CHAR)</span>
+<span class="fc" id="L1175">            .setQuoteMode(QuoteMode.MINIMAL)</span>
+<span class="fc" id="L1176">            .get();</span>
     // @formatter:off
 
     /**
@@ -1162,8 +1194,8 @@ public final class CSVFormat implements
      * &lt;li&gt;{@link Builder#setDelimiter(char) setDelimiter}{@code 
('\t')}&lt;/li&gt;
      * &lt;li&gt;{@link Builder#setEscape(char) setEscape}{@code 
('&quot;')}&lt;/li&gt;
      * &lt;li&gt;{@link Builder#setQuote(char) setQuote}{@code 
('&quot;')}&lt;/li&gt;
-     * &lt;li&gt;{@link Builder#setQuoteMode(QuoteMode) setQuoteMode}{@code 
(QuoteMode.ALL_NON_NULL)}&lt;/li&gt;
-     * &lt;li&gt;{@code setSkipHeaderRecord(false)}&lt;/li&gt;
+     * &lt;li&gt;{@link Builder#setQuoteMode(QuoteMode) setQuoteMode}{@code 
(QuoteMode.MINIMAL)}&lt;/li&gt;
+     * &lt;li&gt;{@link Builder#setSkipHeaderRecord(boolean) 
setSkipHeaderRecord}{@code (false)}&lt;/li&gt;
      * &lt;/ul&gt;
      *
      * @see Predefined#MongoDBCsv
@@ -1173,17 +1205,18 @@ public final class CSVFormat implements
      * @since 1.7
      */
     // @formatter:off
-<span class="fc" id="L1176">    public static final CSVFormat MONGODB_TSV = 
DEFAULT.builder()</span>
-<span class="fc" id="L1177">            .setDelimiter(Constants.TAB)</span>
-<span class="fc" id="L1178">            
.setEscape(Constants.DOUBLE_QUOTE_CHAR)</span>
-<span class="fc" id="L1179">            
.setQuote(Constants.DOUBLE_QUOTE_CHAR)</span>
-<span class="fc" id="L1180">            .setQuoteMode(QuoteMode.MINIMAL)</span>
-<span class="fc" id="L1181">            .setSkipHeaderRecord(false)</span>
-<span class="fc" id="L1182">            .get();</span>
+<span class="fc" id="L1208">    public static final CSVFormat MONGODB_TSV = 
DEFAULT.builder()</span>
+<span class="fc" id="L1209">            .setDelimiter(Constants.TAB)</span>
+<span class="fc" id="L1210">            
.setEscape(Constants.DOUBLE_QUOTE_CHAR)</span>
+<span class="fc" id="L1211">            
.setQuote(Constants.DOUBLE_QUOTE_CHAR)</span>
+<span class="fc" id="L1212">            .setQuoteMode(QuoteMode.MINIMAL)</span>
+<span class="fc" id="L1213">            .setSkipHeaderRecord(false)</span>
+<span class="fc" id="L1214">            .get();</span>
     // @formatter:off
 
     /**
-     * Default MySQL format used by the {@code SELECT INTO OUTFILE} and {@code 
LOAD DATA INFILE} operations.
+     * Default &lt;a 
href=&quot;https://dev.mysql.com/doc/refman/8.0/en/mysqldump-delimited-text.html&quot;&gt;MySQL&lt;/a&gt;
+     * format used by the {@code SELECT INTO OUTFILE} and {@code LOAD DATA 
INFILE} operations.
      *
      * &lt;p&gt;
      * This is a tab-delimited format with an LF character as the line 
separator. Values are not quoted and special
@@ -1205,23 +1238,24 @@ public final class CSVFormat implements
      *
      * @see Predefined#MySQL
      * @see QuoteMode#ALL_NON_NULL
-     * @see &lt;a 
href=&quot;https://dev.mysql.com/doc/refman/5.1/en/load-data.html&quot;&gt; 
https://dev.mysql.com/doc/refman/5.1/en/load
-     *      -data.html&lt;/a&gt;
+     * @see &lt;a 
href=&quot;https://dev.mysql.com/doc/refman/8.0/en/mysqldump-delimited-text.html&quot;&gt;MySQL&lt;/a&gt;
      */
     // @formatter:off
-<span class="fc" id="L1212">    public static final CSVFormat MYSQL = 
DEFAULT.builder()</span>
-<span class="fc" id="L1213">            .setDelimiter(Constants.TAB)</span>
-<span class="fc" id="L1214">            .setEscape(Constants.BACKSLASH)</span>
-<span class="fc" id="L1215">            .setIgnoreEmptyLines(false)</span>
-<span class="fc" id="L1216">            .setQuote(null)</span>
-<span class="fc" id="L1217">            
.setRecordSeparator(Constants.LF)</span>
-<span class="fc" id="L1218">            
.setNullString(Constants.SQL_NULL_STRING)</span>
-<span class="fc" id="L1219">            
.setQuoteMode(QuoteMode.ALL_NON_NULL)</span>
-<span class="fc" id="L1220">            .get();</span>
+<span class="fc" id="L1244">    public static final CSVFormat MYSQL = 
DEFAULT.builder()</span>
+<span class="fc" id="L1245">            .setDelimiter(Constants.TAB)</span>
+<span class="fc" id="L1246">            .setEscape(Constants.BACKSLASH)</span>
+<span class="fc" id="L1247">            .setIgnoreEmptyLines(false)</span>
+<span class="fc" id="L1248">            .setQuote(null)</span>
+<span class="fc" id="L1249">            
.setRecordSeparator(Constants.LF)</span>
+<span class="fc" id="L1250">            
.setNullString(Constants.SQL_NULL_STRING)</span>
+<span class="fc" id="L1251">            
.setQuoteMode(QuoteMode.ALL_NON_NULL)</span>
+<span class="fc" id="L1252">            .get();</span>
     // @formatter:off
 
     /**
-     * Default Oracle format used by the SQL*Loader utility.
+     * Default
+     * &lt;a 
href=&quot;https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/oracle-sql-loader-control-file-contents.html#GUID-D1762699-8154-40F6-90DE-EFB8EB6A9AB0&quot;&gt;Oracle&lt;/a&gt;
+     * format used by the SQL*Loader utility.
      *
      * &lt;p&gt;
      * This is a comma-delimited format with the system line separator 
character as the record separator. Values are
@@ -1245,24 +1279,24 @@ public final class CSVFormat implements
      *
      * @see Predefined#Oracle
      * @see QuoteMode#MINIMAL
-     * @see &lt;a href=&quot;https://s.apache.org/CGXG&quot;&gt;Oracle CSV 
Format Specification&lt;/a&gt;
+     * @see &lt;a 
href=&quot;https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/oracle-sql-loader-control-file-contents.html#GUID-D1762699-8154-40F6-90DE-EFB8EB6A9AB0&quot;&gt;Oracle
 CSV Format Specification&lt;/a&gt;
      * @since 1.6
      */
     // @formatter:off
-<span class="fc" id="L1252">    public static final CSVFormat ORACLE = 
DEFAULT.builder()</span>
-<span class="fc" id="L1253">            .setDelimiter(Constants.COMMA)</span>
-<span class="fc" id="L1254">            .setEscape(Constants.BACKSLASH)</span>
-<span class="fc" id="L1255">            .setIgnoreEmptyLines(false)</span>
-<span class="fc" id="L1256">            
.setQuote(Constants.DOUBLE_QUOTE_CHAR)</span>
-<span class="fc" id="L1257">            
.setNullString(Constants.SQL_NULL_STRING)</span>
-<span class="fc" id="L1258">            .setTrim(true)</span>
-<span class="fc" id="L1259">            
.setRecordSeparator(System.lineSeparator())</span>
-<span class="fc" id="L1260">            .setQuoteMode(QuoteMode.MINIMAL)</span>
-<span class="fc" id="L1261">            .get();</span>
+<span class="fc" id="L1286">    public static final CSVFormat ORACLE = 
DEFAULT.builder()</span>
+<span class="fc" id="L1287">            .setDelimiter(Constants.COMMA)</span>
+<span class="fc" id="L1288">            .setEscape(Constants.BACKSLASH)</span>
+<span class="fc" id="L1289">            .setIgnoreEmptyLines(false)</span>
+<span class="fc" id="L1290">            
.setQuote(Constants.DOUBLE_QUOTE_CHAR)</span>
+<span class="fc" id="L1291">            
.setNullString(Constants.SQL_NULL_STRING)</span>
+<span class="fc" id="L1292">            .setTrim(true)</span>
+<span class="fc" id="L1293">            
.setRecordSeparator(System.lineSeparator())</span>
+<span class="fc" id="L1294">            .setQuoteMode(QuoteMode.MINIMAL)</span>
+<span class="fc" id="L1295">            .get();</span>
     // @formatter:off
 
     /**
-     * Default PostgreSQL CSV format used by the {@code COPY} operation.
+     * Default &lt;a 
href=&quot;https://www.postgresql.org/docs/current/static/sql-copy.html&quot;&gt;PostgreSQL
 CSV&lt;/a&gt; format used by the {@code COPY} operation.
      *
      * &lt;p&gt;
      * This is a comma-delimited format with an LF character as the line 
separator. Values are double quoted and special
@@ -1284,24 +1318,23 @@ public final class CSVFormat implements
      *
      * @see Predefined#MySQL
      * @see QuoteMode#ALL_NON_NULL
-     * @see &lt;a 
href=&quot;https://www.postgresql.org/docs/current/static/sql-copy.html&quot;&gt;PostgreSQL
 COPY command
-     *          documentation&lt;/a&gt;
+     * @see &lt;a 
href=&quot;https://www.postgresql.org/docs/current/static/sql-copy.html&quot;&gt;PostgreSQL
 CSV&lt;/a&gt;
      * @since 1.5
      */
     // @formatter:off
-<span class="fc" id="L1292">    public static final CSVFormat POSTGRESQL_CSV = 
DEFAULT.builder()</span>
-<span class="fc" id="L1293">            .setDelimiter(Constants.COMMA)</span>
-<span class="fc" id="L1294">            .setEscape(null)</span>
-<span class="fc" id="L1295">            .setIgnoreEmptyLines(false)</span>
-<span class="fc" id="L1296">            
.setQuote(Constants.DOUBLE_QUOTE_CHAR)</span>
-<span class="fc" id="L1297">            
.setRecordSeparator(Constants.LF)</span>
-<span class="fc" id="L1298">            .setNullString(Constants.EMPTY)</span>
-<span class="fc" id="L1299">            
.setQuoteMode(QuoteMode.ALL_NON_NULL)</span>
-<span class="fc" id="L1300">            .get();</span>
+<span class="fc" id="L1325">    public static final CSVFormat POSTGRESQL_CSV = 
DEFAULT.builder()</span>
+<span class="fc" id="L1326">            .setDelimiter(Constants.COMMA)</span>
+<span class="fc" id="L1327">            .setEscape(null)</span>
+<span class="fc" id="L1328">            .setIgnoreEmptyLines(false)</span>
+<span class="fc" id="L1329">            
.setQuote(Constants.DOUBLE_QUOTE_CHAR)</span>
+<span class="fc" id="L1330">            
.setRecordSeparator(Constants.LF)</span>
+<span class="fc" id="L1331">            .setNullString(Constants.EMPTY)</span>
+<span class="fc" id="L1332">            
.setQuoteMode(QuoteMode.ALL_NON_NULL)</span>
+<span class="fc" id="L1333">            .get();</span>
     // @formatter:off
 
     /**
-     * Default PostgreSQL text format used by the {@code COPY} operation.
+     * Default &lt;a 
href=&quot;https://www.postgresql.org/docs/current/static/sql-copy.html&quot;&gt;PostgreSQL
 Text&lt;/a&gt; format used by the {@code COPY} operation.
      *
      * &lt;p&gt;
      * This is a tab-delimited format with an LF character as the line 
separator. Values are not quoted and special
@@ -1323,20 +1356,19 @@ public final class CSVFormat implements
      *
      * @see Predefined#MySQL
      * @see QuoteMode#ALL_NON_NULL
-     * @see &lt;a 
href=&quot;https://www.postgresql.org/docs/current/static/sql-copy.html&quot;&gt;PostgreSQL
 COPY command
-     *          documentation&lt;/a&gt;
+     * @see &lt;a 
href=&quot;https://www.postgresql.org/docs/current/static/sql-copy.html&quot;&gt;PostgreSQL
 Text&lt;/a&gt;
      * @since 1.5
      */
     // @formatter:off
-<span class="fc" id="L1331">    public static final CSVFormat POSTGRESQL_TEXT 
= DEFAULT.builder()</span>
-<span class="fc" id="L1332">            .setDelimiter(Constants.TAB)</span>
-<span class="fc" id="L1333">            .setEscape(Constants.BACKSLASH)</span>
-<span class="fc" id="L1334">            .setIgnoreEmptyLines(false)</span>
-<span class="fc" id="L1335">            .setQuote(null)</span>
-<span class="fc" id="L1336">            
.setRecordSeparator(Constants.LF)</span>
-<span class="fc" id="L1337">            
.setNullString(Constants.SQL_NULL_STRING)</span>
-<span class="fc" id="L1338">            
.setQuoteMode(QuoteMode.ALL_NON_NULL)</span>
-<span class="fc" id="L1339">            .get();</span>
+<span class="fc" id="L1363">    public static final CSVFormat POSTGRESQL_TEXT 
= DEFAULT.builder()</span>
+<span class="fc" id="L1364">            .setDelimiter(Constants.TAB)</span>
+<span class="fc" id="L1365">            .setEscape(Constants.BACKSLASH)</span>
+<span class="fc" id="L1366">            .setIgnoreEmptyLines(false)</span>
+<span class="fc" id="L1367">            .setQuote(null)</span>
+<span class="fc" id="L1368">            
.setRecordSeparator(Constants.LF)</span>
+<span class="fc" id="L1369">            
.setNullString(Constants.SQL_NULL_STRING)</span>
+<span class="fc" id="L1370">            
.setQuoteMode(QuoteMode.ALL_NON_NULL)</span>
+<span class="fc" id="L1371">            .get();</span>
     // @formatter:off
 
     /**
@@ -1353,13 +1385,14 @@ public final class CSVFormat implements
      * &lt;/ul&gt;
      *
      * @see Predefined#RFC4180
+     * @see &lt;a href=&quot;https://tools.ietf.org/html/rfc4180&quot;&gt;RFC 
4180&lt;/a&gt;
      */
-<span class="fc" id="L1357">    public static final CSVFormat RFC4180 = 
DEFAULT.builder().setIgnoreEmptyLines(false).get();</span>
+<span class="fc" id="L1390">    public static final CSVFormat RFC4180 = 
DEFAULT.builder().setIgnoreEmptyLines(false).get();</span>
 
     private static final long serialVersionUID = 2L;
 
     /**
-     * Tab-delimited format (TDF).
+     * Tab-delimited format (&lt;a 
href=&quot;https://en.wikipedia.org/wiki/Tab-separated_values&quot;&gt;TDF&lt;/a&gt;).
      *
      * &lt;p&gt;
      * The {@link Builder} settings are the {@link #DEFAULT} 
&lt;em&gt;with&lt;/em&gt;:
@@ -1370,12 +1403,13 @@ public final class CSVFormat implements
      * &lt;/ul&gt;
      *
      * @see Predefined#TDF
+     * @see &lt;a 
href=&quot;https://en.wikipedia.org/wiki/Tab-separated_values&quot;&gt;TDF&lt;/a&gt;
      */
     // @formatter:off
-<span class="fc" id="L1375">    public static final CSVFormat TDF = 
DEFAULT.builder()</span>
-<span class="fc" id="L1376">            .setDelimiter(Constants.TAB)</span>
-<span class="fc" id="L1377">            
.setIgnoreSurroundingSpaces(true)</span>
-<span class="fc" id="L1378">            .get();</span>
+<span class="fc" id="L1409">    public static final CSVFormat TDF = 
DEFAULT.builder()</span>
+<span class="fc" id="L1410">            .setDelimiter(Constants.TAB)</span>
+<span class="fc" id="L1411">            
.setIgnoreSurroundingSpaces(true)</span>
+<span class="fc" id="L1412">            .get();</span>
     // @formatter:on
 
     /**
@@ -1387,7 +1421,7 @@ public final class CSVFormat implements
      */
     @SafeVarargs
     static &lt;T&gt; T[] clone(final T... values) {
-<span class="fc bfc" id="L1390" title="All 2 branches covered.">        return 
values == null ? null : values.clone();</span>
+<span class="fc bfc" id="L1424" title="All 2 branches covered.">        return 
values == null ? null : values.clone();</span>
     }
 
     /**
@@ -1398,7 +1432,7 @@ public final class CSVFormat implements
      * @return true if {@code c} contains a line break character
      */
     private static boolean contains(final String source, final char searchCh) {
-<span class="fc bfc" id="L1401" title="All 2 branches covered.">        return 
Objects.requireNonNull(source, &quot;source&quot;).indexOf(searchCh) &gt;= 
0;</span>
+<span class="fc bfc" id="L1435" title="All 2 branches covered.">        return 
Objects.requireNonNull(source, &quot;source&quot;).indexOf(searchCh) &gt;= 
0;</span>
     }
 
     /**
@@ -1408,7 +1442,7 @@ public final class CSVFormat implements
      * @return true if {@code c} contains a line break character.
      */
     private static boolean containsLineBreak(final String source) {
-<span class="fc bfc" id="L1411" title="All 4 branches covered.">        return 
contains(source, Constants.CR) || contains(source, Constants.LF);</span>
+<span class="fc bfc" id="L1445" title="All 4 branches covered.">        return 
contains(source, Constants.CR) || contains(source, Constants.LF);</span>
     }
 
     /**
@@ -1417,11 +1451,11 @@ public final class CSVFormat implements
      * @return a copy of the given instance or null if the input is null.
      */
     static CSVFormat copy(final CSVFormat format) {
-<span class="pc bpc" id="L1420" title="1 of 2 branches missed.">        return 
format != null ? format.copy() : null;</span>
+<span class="fc bfc" id="L1454" title="All 2 branches covered.">        return 
format != null ? format.copy() : null;</span>
     }
 
     static boolean isBlank(final String value) {
-<span class="fc bfc" id="L1424" title="All 4 branches covered.">        return 
value == null || value.trim().isEmpty();</span>
+<span class="fc bfc" id="L1458" title="All 4 branches covered.">        return 
value == null || value.trim().isEmpty();</span>
     }
 
     /**
@@ -1431,7 +1465,7 @@ public final class CSVFormat implements
      * @return true if {@code c} is a line break character.
      */
     private static boolean isLineBreak(final char c) {
-<span class="fc bfc" id="L1434" title="All 4 branches covered.">        return 
c == Constants.LF || c == Constants.CR;</span>
+<span class="fc bfc" id="L1468" title="All 4 branches covered.">        return 
c == Constants.LF || c == Constants.CR;</span>
     }
 
     /**
@@ -1441,17 +1475,17 @@ public final class CSVFormat implements
      * @return true if {@code c} is a line break character (and not null).
      */
     private static boolean isLineBreak(final Character c) {
-<span class="fc bfc" id="L1444" title="All 4 branches covered.">        return 
c != null &amp;&amp; isLineBreak(c.charValue()); // N.B. Explicit (un)boxing is 
intentional</span>
+<span class="fc bfc" id="L1478" title="All 4 branches covered.">        return 
c != null &amp;&amp; isLineBreak(c.charValue()); // Explicit (un)boxing is 
intentional</span>
     }
 
     /** Same test as in as {@link String#trim()}. */
     private static boolean isTrimChar(final char ch) {
-<span class="fc bfc" id="L1449" title="All 2 branches covered.">        return 
ch &lt;= Constants.SP;</span>
+<span class="fc bfc" id="L1483" title="All 2 branches covered.">        return 
ch &lt;= Constants.SP;</span>
     }
 
     /** Same test as in as {@link String#trim()}. */
     private static boolean isTrimChar(final CharSequence charSequence, final 
int pos) {
-<span class="fc" id="L1454">        return 
isTrimChar(charSequence.charAt(pos));</span>
+<span class="fc" id="L1488">        return 
isTrimChar(charSequence.charAt(pos));</span>
     }
 
     /**
@@ -1471,33 +1505,33 @@ public final class CSVFormat implements
      * @see #TDF
      */
     public static CSVFormat newFormat(final char delimiter) {
-<span class="fc" id="L1474">        return new CSVFormat(new 
Builder().setDelimiter(delimiter));</span>
+<span class="fc" id="L1508">        return new CSVFormat(new 
Builder().setDelimiter(delimiter));</span>
     }
 
     static String[] toStringArray(final Object[] values) {
-<span class="fc bfc" id="L1478" title="All 2 branches covered.">        if 
(values == null) {</span>
-<span class="fc" id="L1479">            return null;</span>
+<span class="fc bfc" id="L1512" title="All 2 branches covered.">        if 
(values == null) {</span>
+<span class="fc" id="L1513">            return null;</span>
         }
-<span class="fc" id="L1481">        final String[] strings = new 
String[values.length];</span>
-<span class="fc" id="L1482">        Arrays.setAll(strings, i -&gt; 
Objects.toString(values[i], null));</span>
-<span class="fc" id="L1483">        return strings;</span>
+<span class="fc" id="L1515">        final String[] strings = new 
String[values.length];</span>
+<span class="fc" id="L1516">        Arrays.setAll(strings, i -&gt; 
Objects.toString(values[i], null));</span>
+<span class="fc" id="L1517">        return strings;</span>
     }
 
     static CharSequence trim(final CharSequence charSequence) {
-<span class="fc bfc" id="L1487" title="All 2 branches covered.">        if 
(charSequence instanceof String) {</span>
-<span class="fc" id="L1488">            return ((String) 
charSequence).trim();</span>
+<span class="fc bfc" id="L1521" title="All 2 branches covered.">        if 
(charSequence instanceof String) {</span>
+<span class="fc" id="L1522">            return ((String) 
charSequence).trim();</span>
         }
-<span class="fc" id="L1490">        final int count = 
charSequence.length();</span>
-<span class="fc" id="L1491">        int len = count;</span>
-<span class="fc" id="L1492">        int pos = 0;</span>
+<span class="fc" id="L1524">        final int count = 
charSequence.length();</span>
+<span class="fc" id="L1525">        int len = count;</span>
+<span class="fc" id="L1526">        int pos = 0;</span>
 
-<span class="fc bfc" id="L1494" title="All 4 branches covered.">        while 
(pos &lt; len &amp;&amp; isTrimChar(charSequence, pos)) {</span>
-<span class="fc" id="L1495">            pos++;</span>
+<span class="fc bfc" id="L1528" title="All 4 branches covered.">        while 
(pos &lt; len &amp;&amp; isTrimChar(charSequence, pos)) {</span>
+<span class="fc" id="L1529">            pos++;</span>
         }
-<span class="fc bfc" id="L1497" title="All 4 branches covered.">        while 
(pos &lt; len &amp;&amp; isTrimChar(charSequence, len - 1)) {</span>
-<span class="fc" id="L1498">            len--;</span>
+<span class="fc bfc" id="L1531" title="All 4 branches covered.">        while 
(pos &lt; len &amp;&amp; isTrimChar(charSequence, len - 1)) {</span>
+<span class="fc" id="L1532">            len--;</span>
         }
-<span class="fc bfc" id="L1500" title="All 4 branches covered.">        return 
pos &gt; 0 || len &lt; count ? charSequence.subSequence(pos, len) : 
charSequence;</span>
+<span class="fc bfc" id="L1534" title="All 4 branches covered.">        return 
pos &gt; 0 || len &lt; count ? charSequence.subSequence(pos, len) : 
charSequence;</span>
     }
 
     /**
@@ -1508,7 +1542,7 @@ public final class CSVFormat implements
      * @since 1.2
      */
     public static CSVFormat valueOf(final String format) {
-<span class="fc" id="L1511">        return 
CSVFormat.Predefined.valueOf(format).getFormat();</span>
+<span class="fc" id="L1545">        return 
CSVFormat.Predefined.valueOf(format).getFormat();</span>
     }
 
     /** How duplicate headers are handled. */
@@ -1574,46 +1608,50 @@ public final class CSVFormat implements
     /** Whether to trim leading and trailing blanks. */
     private final boolean trim;
 
-<span class="fc" id="L1577">    private CSVFormat(final Builder builder) 
{</span>
-<span class="fc" id="L1578">        this.delimiter = builder.delimiter;</span>
-<span class="fc" id="L1579">        this.quoteCharacter = 
builder.quoteCharacter;</span>
-<span class="fc" id="L1580">        this.quoteMode = builder.quoteMode;</span>
-<span class="fc" id="L1581">        this.commentMarker = 
builder.commentMarker;</span>
-<span class="fc" id="L1582">        this.escapeCharacter = 
builder.escapeCharacter;</span>
-<span class="fc" id="L1583">        this.ignoreSurroundingSpaces = 
builder.ignoreSurroundingSpaces;</span>
-<span class="fc" id="L1584">        this.allowMissingColumnNames = 
builder.allowMissingColumnNames;</span>
-<span class="fc" id="L1585">        this.ignoreEmptyLines = 
builder.ignoreEmptyLines;</span>
-<span class="fc" id="L1586">        this.recordSeparator = 
builder.recordSeparator;</span>
-<span class="fc" id="L1587">        this.nullString = 
builder.nullString;</span>
-<span class="fc" id="L1588">        this.headerComments = 
builder.headerComments;</span>
-<span class="fc" id="L1589">        this.headers = builder.headers;</span>
-<span class="fc" id="L1590">        this.skipHeaderRecord = 
builder.skipHeaderRecord;</span>
-<span class="fc" id="L1591">        this.ignoreHeaderCase = 
builder.ignoreHeaderCase;</span>
-<span class="fc" id="L1592">        this.lenientEof = 
builder.lenientEof;</span>
-<span class="fc" id="L1593">        this.trailingData = 
builder.trailingData;</span>
-<span class="fc" id="L1594">        this.trailingDelimiter = 
builder.trailingDelimiter;</span>
-<span class="fc" id="L1595">        this.trim = builder.trim;</span>
-<span class="fc" id="L1596">        this.autoFlush = builder.autoFlush;</span>
-<span class="fc" id="L1597">        this.quotedNullString = 
builder.quotedNullString;</span>
-<span class="fc" id="L1598">        this.duplicateHeaderMode = 
builder.duplicateHeaderMode;</span>
-<span class="fc" id="L1599">        validate();</span>
-<span class="fc" id="L1600">    }</span>
+    /** The maximum number of rows to process, excluding the header row. */
+    private final long maxRows;
+
+<span class="fc" id="L1614">    private CSVFormat(final Builder builder) 
{</span>
+<span class="fc" id="L1615">        this.allowMissingColumnNames = 
builder.allowMissingColumnNames;</span>
+<span class="fc" id="L1616">        this.autoFlush = builder.autoFlush;</span>
+<span class="fc" id="L1617">        this.commentMarker = 
builder.commentMarker;</span>
+<span class="fc" id="L1618">        this.delimiter = builder.delimiter;</span>
+<span class="fc" id="L1619">        this.duplicateHeaderMode = 
builder.duplicateHeaderMode;</span>
+<span class="fc" id="L1620">        this.escapeCharacter = 
builder.escapeCharacter;</span>
+<span class="fc" id="L1621">        this.headerComments = 
builder.headerComments;</span>
+<span class="fc" id="L1622">        this.headers = builder.headers;</span>
+<span class="fc" id="L1623">        this.ignoreEmptyLines = 
builder.ignoreEmptyLines;</span>
+<span class="fc" id="L1624">        this.ignoreHeaderCase = 
builder.ignoreHeaderCase;</span>
+<span class="fc" id="L1625">        this.ignoreSurroundingSpaces = 
builder.ignoreSurroundingSpaces;</span>
+<span class="fc" id="L1626">        this.lenientEof = 
builder.lenientEof;</span>
+<span class="fc" id="L1627">        this.maxRows = builder.maxRows;</span>
+<span class="fc" id="L1628">        this.nullString = 
builder.nullString;</span>
+<span class="fc" id="L1629">        this.quoteCharacter = 
builder.quoteCharacter;</span>
+<span class="fc" id="L1630">        this.quoteMode = builder.quoteMode;</span>
+<span class="fc" id="L1631">        this.quotedNullString = 
builder.quotedNullString;</span>
+<span class="fc" id="L1632">        this.recordSeparator = 
builder.recordSeparator;</span>
+<span class="fc" id="L1633">        this.skipHeaderRecord = 
builder.skipHeaderRecord;</span>
+<span class="fc" id="L1634">        this.trailingData = 
builder.trailingData;</span>
+<span class="fc" id="L1635">        this.trailingDelimiter = 
builder.trailingDelimiter;</span>
+<span class="fc" id="L1636">        this.trim = builder.trim;</span>
+<span class="fc" id="L1637">        validate();</span>
+<span class="fc" id="L1638">    }</span>
 
     private void append(final char c, final Appendable appendable) throws 
IOException {
         // try {
-<span class="fc" id="L1604">        appendable.append(c);</span>
+<span class="fc" id="L1642">        appendable.append(c);</span>
         // } catch (final IOException e) {
         // throw new UncheckedIOException(e);
         // }
-<span class="fc" id="L1608">    }</span>
+<span class="fc" id="L1646">    }</span>
 
     private void append(final CharSequence csq, final Appendable appendable) 
throws IOException {
         // try {
-<span class="fc" id="L1612">        appendable.append(csq);</span>
+<span class="fc" id="L1650">        appendable.append(csq);</span>
         // } catch (final IOException e) {
         // throw new UncheckedIOException(e);
         // }
-<span class="fc" id="L1616">    }</span>
+<span class="fc" id="L1654">    }</span>
 
     /**
      * Creates a new Builder for this instance.
@@ -1621,7 +1659,7 @@ public final class CSVFormat implements
      * @return a new Builder.
      */
     public Builder builder() {
-<span class="fc" id="L1624">        return Builder.create(this);</span>
+<span class="fc" id="L1662">        return Builder.create(this);</span>
     }
 
     /**
@@ -1630,55 +1668,55 @@ public final class CSVFormat implements
      * @return a copy of this instance.
      */
     CSVFormat copy() {
-<span class="fc" id="L1633">        return builder().get();</span>
+<span class="fc" id="L1671">        return builder().get();</span>
     }
 
     @Override
     public boolean equals(final Object obj) {
-<span class="fc bfc" id="L1638" title="All 2 branches covered.">        if 
(this == obj) {</span>
-<span class="fc" id="L1639">            return true;</span>
+<span class="fc bfc" id="L1676" title="All 2 branches covered.">        if 
(this == obj) {</span>
+<span class="fc" id="L1677">            return true;</span>
         }
-<span class="fc bfc" id="L1641" title="All 2 branches covered.">        if 
(obj == null) {</span>
-<span class="fc" id="L1642">            return false;</span>
+<span class="fc bfc" id="L1679" title="All 2 branches covered.">        if 
(obj == null) {</span>
+<span class="fc" id="L1680">            return false;</span>
         }
-<span class="fc bfc" id="L1644" title="All 2 branches covered.">        if 
(getClass() != obj.getClass()) {</span>
-<span class="fc" id="L1645">            return false;</span>
+<span class="fc bfc" id="L1682" title="All 2 branches covered.">        if 
(getClass() != obj.getClass()) {</span>
+<span class="fc" id="L1683">            return false;</span>
         }
-<span class="fc" id="L1647">        final CSVFormat other = (CSVFormat) 
obj;</span>
-<span class="fc bfc" id="L1648" title="All 4 branches covered.">        return 
allowMissingColumnNames == other.allowMissingColumnNames &amp;&amp; autoFlush 
== other.autoFlush &amp;&amp;</span>
-<span class="fc bfc" id="L1649" title="All 6 branches covered.">               
 Objects.equals(commentMarker, other.commentMarker) &amp;&amp; 
Objects.equals(delimiter, other.delimiter) &amp;&amp;</span>
-<span class="fc bfc" id="L1650" title="All 2 branches covered.">               
 duplicateHeaderMode == other.duplicateHeaderMode &amp;&amp; 
Objects.equals(escapeCharacter, other.escapeCharacter) &amp;&amp;</span>
-<span class="pc bpc" id="L1651" title="1 of 12 branches missed.">              
  Arrays.equals(headerComments, other.headerComments) &amp;&amp; 
Arrays.equals(headers, other.headers) &amp;&amp;</span>
+<span class="fc" id="L1685">        final CSVFormat other = (CSVFormat) 
obj;</span>
+<span class="fc bfc" id="L1686" title="All 4 branches covered.">        return 
allowMissingColumnNames == other.allowMissingColumnNames &amp;&amp; autoFlush 
== other.autoFlush &amp;&amp;</span>
+<span class="fc bfc" id="L1687" title="All 6 branches covered.">               
 Objects.equals(commentMarker, other.commentMarker) &amp;&amp; 
Objects.equals(delimiter, other.delimiter) &amp;&amp;</span>
+<span class="fc bfc" id="L1688" title="All 2 branches covered.">               
 duplicateHeaderMode == other.duplicateHeaderMode &amp;&amp; 
Objects.equals(escapeCharacter, other.escapeCharacter) &amp;&amp;</span>
+<span class="pc bpc" id="L1689" title="1 of 12 branches missed.">              
  Arrays.equals(headerComments, other.headerComments) &amp;&amp; 
Arrays.equals(headers, other.headers) &amp;&amp;</span>
                 ignoreEmptyLines == other.ignoreEmptyLines &amp;&amp; 
ignoreHeaderCase == other.ignoreHeaderCase &amp;&amp;
                 ignoreSurroundingSpaces == other.ignoreSurroundingSpaces 
&amp;&amp; lenientEof == other.lenientEof &amp;&amp;
-<span class="fc bfc" id="L1654" title="All 6 branches covered.">               
 Objects.equals(nullString, other.nullString) &amp;&amp; 
Objects.equals(quoteCharacter, other.quoteCharacter) &amp;&amp;</span>
-<span class="pc bpc" id="L1655" title="1 of 2 branches missed.">               
 quoteMode == other.quoteMode &amp;&amp; Objects.equals(quotedNullString, 
other.quotedNullString) &amp;&amp;</span>
-<span class="pc bpc" id="L1656" title="1 of 10 branches missed.">              
  Objects.equals(recordSeparator, other.recordSeparator) &amp;&amp; 
skipHeaderRecord == other.skipHeaderRecord &amp;&amp;</span>
+<span class="fc bfc" id="L1692" title="All 6 branches covered.">               
 Objects.equals(nullString, other.nullString) &amp;&amp; 
Objects.equals(quoteCharacter, other.quoteCharacter) &amp;&amp;</span>
+<span class="pc bpc" id="L1693" title="1 of 2 branches missed.">               
 quoteMode == other.quoteMode &amp;&amp; Objects.equals(quotedNullString, 
other.quotedNullString) &amp;&amp;</span>
+<span class="pc bpc" id="L1694" title="1 of 10 branches missed.">              
  Objects.equals(recordSeparator, other.recordSeparator) &amp;&amp; 
skipHeaderRecord == other.skipHeaderRecord &amp;&amp;</span>
                 trailingData == other.trailingData &amp;&amp; 
trailingDelimiter == other.trailingDelimiter &amp;&amp; trim == other.trim;
     }
 
     private void escape(final char c, final Appendable appendable) throws 
IOException {
-<span class="fc" id="L1661">        append(escapeCharacter.charValue(), 
appendable); // N.B. Explicit (un)boxing is intentional</span>
-<span class="fc" id="L1662">        append(c, appendable);</span>
-<span class="fc" id="L1663">    }</span>
+<span class="fc" id="L1699">        append(escapeCharacter.charValue(), 
appendable); // Explicit (un)boxing is intentional</span>
+<span class="fc" id="L1700">        append(c, appendable);</span>
+<span class="fc" id="L1701">    }</span>
 
     /**
-     * Formats the specified values.
+     * Formats the specified values as a CSV record string.
      *
-     * @param values the values to format
-     * @return the formatted values
+     * @param values the values to format.
+     * @return the formatted values.
      */
     public String format(final Object... values) {
-<span class="fc" id="L1672">        return Uncheck.get(() -&gt; 
format_(values));</span>
+<span class="fc" id="L1710">        return Uncheck.get(() -&gt; 
format_(values));</span>
     }
 
     private String format_(final Object... values) throws IOException {
-<span class="fc" id="L1676">        final StringWriter out = new 
StringWriter();</span>
-<span class="fc" id="L1677">        try (CSVPrinter csvPrinter = new 
CSVPrinter(out, this)) {</span>
-<span class="fc" id="L1678">            csvPrinter.printRecord(values);</span>
-<span class="fc" id="L1679">            final String res = 
out.toString();</span>
-<span class="fc bfc" id="L1680" title="All 2 branches covered.">            
final int len = recordSeparator != null ? res.length() - 
recordSeparator.length() : res.length();</span>
-<span class="fc" id="L1681">            return res.substring(0, len);</span>
+<span class="fc" id="L1714">        final StringWriter out = new 
StringWriter();</span>
+<span class="fc" id="L1715">        try (CSVPrinter csvPrinter = new 
CSVPrinter(out, this)) {</span>
+<span class="fc" id="L1716">            csvPrinter.printRecord(values);</span>
+<span class="fc" id="L1717">            final String res = 
out.toString();</span>
+<span class="fc bfc" id="L1718" title="All 2 branches covered.">            
final int len = recordSeparator != null ? res.length() - 
recordSeparator.length() : res.length();</span>
+<span class="fc" id="L1719">            return res.substring(0, len);</span>
         }
     }
 
@@ -1691,7 +1729,7 @@ public final class CSVFormat implements
      */
     @Deprecated
     public boolean getAllowDuplicateHeaderNames() {
-<span class="fc bfc" id="L1694" title="All 2 branches covered.">        return 
duplicateHeaderMode == DuplicateHeaderMode.ALLOW_ALL;</span>
+<span class="fc bfc" id="L1732" title="All 2 branches covered.">        return 
duplicateHeaderMode == DuplicateHeaderMode.ALLOW_ALL;</span>
     }
 
     /**
@@ -1700,7 +1738,7 @@ public final class CSVFormat implements
      * @return {@code true} if missing column names are allowed when parsing 
the header line, {@code false} to throw an {@link IllegalArgumentException}.
      */
     public boolean getAllowMissingColumnNames() {
-<span class="fc" id="L1703">        return allowMissingColumnNames;</span>
+<span class="fc" id="L1741">        return allowMissingColumnNames;</span>
     }
 
     /**
@@ -1710,7 +1748,7 @@ public final class CSVFormat implements
      * @since 1.6
      */
     public boolean getAutoFlush() {
-<span class="fc" id="L1713">        return autoFlush;</span>
+<span class="fc" id="L1751">        return autoFlush;</span>
     }
 
     /**
@@ -1747,7 +1785,7 @@ public final class CSVFormat implements
      * @return the comment start marker, may be {@code null}
      */
     public Character getCommentMarker() {
-<span class="fc" id="L1750">        return commentMarker;</span>
+<span class="fc" id="L1788">        return commentMarker;</span>
     }
 
     /**
@@ -1758,7 +1796,7 @@ public final class CSVFormat implements
      */
     @Deprecated
     public char getDelimiter() {
-<span class="fc" id="L1761">        return delimiter.charAt(0);</span>
+<span class="fc" id="L1799">        return delimiter.charAt(0);</span>
     }
 
     /**
@@ -1767,7 +1805,7 @@ public final class CSVFormat implements
      * @return the delimiter.
      */
     char[] getDelimiterCharArray() {
-<span class="fc" id="L1770">        return delimiter.toCharArray();</span>
+<span class="fc" id="L1808">        return delimiter.toCharArray();</span>
     }
 
     /**
@@ -1777,7 +1815,7 @@ public final class CSVFormat implements
      * @since 1.9.0
      */
     public String getDelimiterString() {
-<span class="fc" id="L1780">        return delimiter;</span>
+<span class="fc" id="L1818">        return delimiter;</span>
     }
 
     /**
@@ -1787,7 +1825,7 @@ public final class CSVFormat implements
      * @since 1.10.0
      */
     public DuplicateHeaderMode getDuplicateHeaderMode() {
-<span class="fc" id="L1790">        return duplicateHeaderMode;</span>
+<span class="fc" id="L1828">        return duplicateHeaderMode;</span>
     }
 
     /**
@@ -1796,7 +1834,7 @@ public final class CSVFormat implements
      * @return the escape character, may be {@code 0}
      */
     char getEscapeChar() {
-<span class="pc bpc" id="L1799" title="1 of 2 branches missed.">        return 
escapeCharacter != null ? escapeCharacter.charValue() : 0; // N.B. Explicit 
(un)boxing is intentional</span>
+<span class="pc bpc" id="L1837" title="1 of 2 branches missed.">        return 
escapeCharacter != null ? escapeCharacter.charValue() : 0; // Explicit 
(un)boxing is intentional</span>
     }
 
     /**
@@ -1805,7 +1843,7 @@ public final class CSVFormat implements
      * @return the escape character, may be {@code null}
      */
     public Character getEscapeCharacter() {
-<span class="fc" id="L1808">        return escapeCharacter;</span>
+<span class="fc" id="L1846">        return escapeCharacter;</span>
     }
 
     /**
@@ -1814,7 +1852,7 @@ public final class CSVFormat implements
      * @return a copy of the header array; {@code null} if disabled, the empty 
array if to be read from the file
      */
     public String[] getHeader() {
-<span class="fc bfc" id="L1817" title="All 2 branches covered.">        return 
headers != null ? headers.clone() : null;</span>
+<span class="fc bfc" id="L1855" title="All 2 branches covered.">        return 
headers != null ? headers.clone() : null;</span>
     }
 
     /**
@@ -1851,7 +1889,7 @@ public final class CSVFormat implements
      * @return a copy of the header comment array; {@code null} if disabled.
      */
     public String[] getHeaderComments() {
-<span class="fc bfc" id="L1854" title="All 2 branches covered.">        return 
headerComments != null ? headerComments.clone() : null;</span>
+<span class="fc bfc" id="L1892" title="All 2 branches covered.">        return 
headerComments != null ? headerComments.clone() : null;</span>
     }
 
     /**
@@ -1860,7 +1898,7 @@ public final class CSVFormat implements
      * @return {@code true} if empty lines between records are ignored, {@code 
false} if they are turned into empty records.
      */
     public boolean getIgnoreEmptyLines() {
-<span class="fc" id="L1863">        return ignoreEmptyLines;</span>
+<span class="fc" id="L1901">        return ignoreEmptyLines;</span>
     }
 
     /**
@@ -1870,7 +1908,7 @@ public final class CSVFormat implements
      * @since 1.3
      */
     public boolean getIgnoreHeaderCase() {
-<span class="fc" id="L1873">        return ignoreHeaderCase;</span>
+<span class="fc" id="L1911">        return ignoreHeaderCase;</span>
     }
 
     /**
@@ -1879,7 +1917,7 @@ public final class CSVFormat implements
      * @return {@code true} if spaces around values are ignored, {@code false} 
if they are treated as part of the value.
      */
     public boolean getIgnoreSurroundingSpaces() {
-<span class="fc" id="L1882">        return ignoreSurroundingSpaces;</span>
+<span class="fc" id="L1920">        return ignoreSurroundingSpaces;</span>
     }
 
     /**
@@ -1889,7 +1927,20 @@ public final class CSVFormat implements
      * @since 1.11.0
      */
     public boolean getLenientEof() {
-<span class="fc" id="L1892">        return lenientEof;</span>
+<span class="fc" id="L1930">        return lenientEof;</span>
+    }
+
+    /**
+     * Gets the maximum number of rows to process, excluding the header row.
+     * &lt;p&gt;
+     * Values less than or equal to 0 mean no limit.
+     * &lt;/p&gt;
+     *
+     * @return The maximum number of rows to process, excluding the header row.
+     * @since 1.14.0
+     */
+    public long getMaxRows() {
+<span class="fc" id="L1943">        return maxRows;</span>
     }
 
     /**
@@ -1902,7 +1953,7 @@ public final class CSVFormat implements
      * @return the String to convert to and from {@code null}. No substitution 
occurs if {@code null}
      */
     public String getNullString() {
-<span class="fc" id="L1905">        return nullString;</span>
+<span class="fc" id="L1956">        return nullString;</span>
     }
 
     /**
@@ -1911,7 +1962,7 @@ public final class CSVFormat implements
      * @return the quoteChar character, may be {@code null}
      */
     public Character getQuoteCharacter() {
-<span class="fc" id="L1914">        return quoteCharacter;</span>
+<span class="fc" id="L1965">        return quoteCharacter;</span>
     }
 
     /**
@@ -1920,7 +1971,7 @@ public final class CSVFormat implements
      * @return the quote policy
      */
     public QuoteMode getQuoteMode() {
-<span class="fc" id="L1923">        return quoteMode;</span>
+<span class="fc" id="L1974">        return quoteMode;</span>
     }
 
     /**
@@ -1929,7 +1980,7 @@ public final class CSVFormat implements
      * @return the record separator
      */
     public String getRecordSeparator() {
-<span class="fc" id="L1932">        return recordSeparator;</span>
+<span class="fc" id="L1983">        return recordSeparator;</span>
     }
 
     /**
@@ -1938,7 +1989,7 @@ public final class CSVFormat implements
      * @return whether to skip the header record.
      */
     public boolean getSkipHeaderRecord() {
-<span class="fc" id="L1941">        return skipHeaderRecord;</span>
+<span class="fc" id="L1992">        return skipHeaderRecord;</span>
     }
 
     /**
@@ -1948,7 +1999,7 @@ public final class CSVFormat implements
      * @since 1.11.0
      */
     public boolean getTrailingData() {
-<span class="fc" id="L1951">        return trailingData;</span>
+<span class="fc" id="L2002">        return trailingData;</span>
     }
 
     /**
@@ -1958,7 +2009,7 @@ public final class CSVFormat implements
      * @since 1.3
      */
     public boolean getTrailingDelimiter() {
-<span class="fc" id="L1961">        return trailingDelimiter;</span>
+<span class="fc" id="L2012">        return trailingDelimiter;</span>
     }
 
     /**
@@ -1967,19 +2018,18 @@ public final class CSVFormat implements
      * @return whether to trim leading and trailing blanks.
      */
     public boolean getTrim() {
-<span class="fc" id="L1970">        return trim;</span>
+<span class="fc" id="L2021">        return trim;</span>
     }
 
     @Override
     public int hashCode() {
-<span class="fc" id="L1975">        final int prime = 31;</span>
-<span class="fc" id="L1976">        int result = 1;</span>
-<span class="fc" id="L1977">        result = prime * result + 
Arrays.hashCode(headerComments);</span>
-<span class="fc" id="L1978">        result = prime * result + 
Arrays.hashCode(headers);</span>
-<span class="fc" id="L1979">        result = prime * result + 
Objects.hash(allowMissingColumnNames, autoFlush, commentMarker, delimiter, 
duplicateHeaderMode, escapeCharacter,</span>
-<span class="fc" id="L1980">                ignoreEmptyLines, 
ignoreHeaderCase, ignoreSurroundingSpaces, lenientEof, nullString, 
quoteCharacter, quoteMode, quotedNullString,</span>
-<span class="fc" id="L1981">                recordSeparator, skipHeaderRecord, 
trailingData, trailingDelimiter, trim);</span>
-<span class="fc" id="L1982">        return result;</span>
+<span class="fc" id="L2026">        final int prime = 31;</span>
+<span class="fc" id="L2027">        int result = 1;</span>
+<span class="fc" id="L2028">        result = prime * result + 
Arrays.hashCode(headerComments);</span>
+<span class="fc" id="L2029">        result = prime * result + 
Arrays.hashCode(headers);</span>
+<span class="fc" id="L2030">        return prime * result + 
Objects.hash(allowMissingColumnNames, autoFlush, commentMarker, delimiter, 
duplicateHeaderMode, escapeCharacter,</span>
+<span class="fc" id="L2031">                ignoreEmptyLines, 
ignoreHeaderCase, ignoreSurroundingSpaces, lenientEof, nullString, 
quoteCharacter, quoteMode, quotedNullString,</span>
+<span class="fc" id="L2032">                recordSeparator, skipHeaderRecord, 
trailingData, trailingDelimiter, trim);</span>
     }
 
     /**
@@ -1990,7 +2040,7 @@ public final class CSVFormat implements
      * @return {@code true} is comments are supported, {@code false} otherwise
      */
     public boolean isCommentMarkerSet() {
-<span class="fc bfc" id="L1993" title="All 2 branches covered.">        return 
commentMarker != null;</span>
+<span class="fc bfc" id="L2043" title="All 2 branches covered.">        return 
commentMarker != null;</span>
     }
 
     /**
@@ -2004,19 +2054,19 @@ public final class CSVFormat implements
      * @return true if the match is successful
      */
     private boolean isDelimiter(final char ch0, final CharSequence charSeq, 
final int startIndex, final char[] delimiter, final int delimiterLength) {
-<span class="fc bfc" id="L2007" title="All 2 branches covered.">        if 
(ch0 != delimiter[0]) {</span>
-<span class="fc" id="L2008">            return false;</span>
+<span class="fc bfc" id="L2057" title="All 2 branches covered.">        if 
(ch0 != delimiter[0]) {</span>
+<span class="fc" id="L2058">            return false;</span>
         }
-<span class="fc" id="L2010">        final int len = charSeq.length();</span>
-<span class="fc bfc" id="L2011" title="All 2 branches covered.">        if 
(startIndex + delimiterLength &gt; len) {</span>
-<span class="fc" id="L2012">            return false;</span>
-        }
-<span class="fc bfc" id="L2014" title="All 2 branches covered.">        for 
(int i = 1; i &lt; delimiterLength; i++) {</span>
-<span class="fc bfc" id="L2015" title="All 2 branches covered.">            if 
(charSeq.charAt(startIndex + i) != delimiter[i]) {</span>
-<span class="fc" id="L2016">                return false;</span>
+<span class="fc" id="L2060">        final int len = charSeq.length();</span>
+<span class="fc bfc" id="L2061" title="All 2 branches covered.">        if 
(startIndex + delimiterLength &gt; len) {</span>
+<span class="fc" id="L2062">            return false;</span>
+        }
+<span class="fc bfc" id="L2064" title="All 2 branches covered.">        for 
(int i = 1; i &lt; delimiterLength; i++) {</span>
+<span class="fc bfc" id="L2065" title="All 2 branches covered.">            if 
(charSeq.charAt(startIndex + i) != delimiter[i]) {</span>
+<span class="fc" id="L2066">                return false;</span>
             }
         }
-<span class="fc" id="L2019">        return true;</span>
+<span class="fc" id="L2069">        return true;</span>
     }
 
     /**
@@ -2025,7 +2075,7 @@ public final class CSVFormat implements
      * @return {@code true} if escapes are processed
      */
     public boolean isEscapeCharacterSet() {
-<span class="fc bfc" id="L2028" title="All 2 branches covered.">        return 
escapeCharacter != null;</span>
+<span class="fc bfc" id="L2078" title="All 2 branches covered.">        return 
escapeCharacter != null;</span>
     }
 
     /**
@@ -2034,7 +2084,7 @@ public final class CSVFormat implements
      * @return {@code true} if a nullString is defined

[... 1087 lines stripped ...]


Reply via email to