@@ -205,7 +205,7 @@ public CsvReader(Reader inputStream, char delimiter) {
205205 *
206206 * @param inputStream
207207 * The stream to use as the data source.
208- * @param delimiter
208+ * @param delimiters
209209 * The character to use as the column delimiter.
210210 */
211211 public CsvReader (Reader inputStream , List <String > delimiters ) {
@@ -1317,9 +1317,8 @@ private void checkDataLength() throws IOException {
13171317 }
13181318
13191319 try {
1320- // 读 1024 个字节到 dataBuffer 中
1321- dataBuffer .Count = inputStream .read (dataBuffer .Buffer , 0 ,
1322- dataBuffer .Buffer .length );
1320+ // Note: inputStream.read cannot guarantee reading the length byte of dataBuffer.Buffer.length
1321+ dataBuffer .Count = inputStream .read (dataBuffer .Buffer , 0 , dataBuffer .Buffer .length );
13231322 } catch (IOException ex ) {
13241323 close ();
13251324
@@ -1715,16 +1714,18 @@ public int findDelimiterLen(char currentLetter, List<String> delimiters) throws
17151714 // Using pre ReadBuffer to read pre-read characters instead of expanding
17161715 // the dataBuffer length may result in OOM
17171716 char [] preReadBuffer = new char [0 ];
1718- if (dataBuffer .Position + delimiterLen > dataBuffer .Buffer . length ) {
1719- skipLenInNextRead = dataBuffer .Position + delimiterLen - dataBuffer .Buffer . length ;
1717+ if (dataBuffer .Position + delimiterLen > dataBuffer .Count ) {
1718+ skipLenInNextRead = dataBuffer .Position + delimiterLen - dataBuffer .Count ;
17201719 preReadBuffer = new char [skipLenInNextRead ];
17211720 inputStream .mark (skipLenInNextRead );
1722- inputStream .read (preReadBuffer , 0 , skipLenInNextRead );
1721+ int count = inputStream .read (preReadBuffer , 0 , skipLenInNextRead );
17231722 inputStream .reset ();
1723+ // First, copy the bytes from the previous dataBuffer into the buffer
17241724 System .arraycopy (dataBuffer .Buffer , dataBuffer .Position , buffer , 0 ,
1725- dataBuffer .Buffer .length - dataBuffer .Position );
1725+ dataBuffer .Count - dataBuffer .Position );
1726+ // Copy the remaining bytes from the preReadBuffer into the buffer
17261727 System .arraycopy (preReadBuffer , 0 , buffer ,
1727- dataBuffer .Buffer . length - dataBuffer .Position , skipLenInNextRead );
1728+ dataBuffer .Count - dataBuffer .Position , skipLenInNextRead );
17281729 } else {
17291730 System .arraycopy (dataBuffer .Buffer , dataBuffer .Position , buffer , 0 , delimiterLen );
17301731 }
0 commit comments