String readLine(boolean ignoreLF) throws IOException {
//行(hang)數(shù)據(jù)的緩沖s
StringBuffer s = null;
int startChar;
synchronized (lock) {
/*確保被bufferedReader包裝的輸入流沒有關(guān)閉*/
ensureOpen();
/* 如果 讀到'\r',skipLF置為true,
* 這是skip()方法里面的部分代碼,它展示了通過skipLF來忽略'\n'
* if (skipLF) {
skipLF = false;
if (cb[nextChar] == '\n') {
nextChar++;
}
}
*ignoreLF一直就是false
**/
boolean omitLF = ignoreLF || skipLF;
/* bufferLoop主要是不斷地遍歷底層的數(shù)組cb,并取兩個(gè)換行符之間的數(shù)據(jù)付給行緩沖s。當(dāng)?shù)讓訑?shù)組遍歷完要用fill()把數(shù)據(jù)從流中填充到cb,直到流的末尾
*charloop,主要是遍歷緩沖數(shù)組cb,以確定'\n','\r'的位置
nextChar:下次讀取緩沖字符數(shù)組cb的位置,
nChars:緩沖字符數(shù)組cb的length
*/
bufferLoop:
for (;;) {
//1、如果緩沖數(shù)組的數(shù)據(jù)不足,或者已經(jīng)讀到了數(shù)組的末尾時(shí):
//1.1如果下次讀取的位置已經(jīng)到了or超過數(shù)組的長(zhǎng)度,從流中讀數(shù)據(jù)到緩沖數(shù)組cb中
if (nextChar >= nChars)
fill();
/*1.2如果從流中讀數(shù)據(jù)到數(shù)組cb之后, nextChar,nChars的大小關(guān)系沒有改變.
說明到了文件的末尾,END OF FILE.返回s
*/
if (nextChar >= nChars) { /* EOF */
if (s != null && s.length() > 0)
return s.toString();
else
return null;
}
//2 緩沖數(shù)組中有足夠的數(shù)據(jù)時(shí):
/*從本個(gè)換行符所在的索引位置開始,遍歷char [] cb ,直到找到\n \r,把兩個(gè)換行符之間的字符序列填充進(jìn)s
*eol:END OF LINE
*類屬性char [] cb ,也就是bufferReader類的緩沖數(shù)組。length由構(gòu)造器指定,若不指定默認(rèn)為8 * 1024 = 8192,與內(nèi)存頁大小密切相關(guān)
* */
boolean eol = false;
char c = 0;
int i;
if (omitLF && (cb[nextChar] == '\n'))
nextChar++;
skipLF = false;
omitLF = false;
charLoop:
for (i = nextChar; i < nChars; i++) {
c = cb[i];
if ((c == '\n') || (c == '\r')) {
eol = true;
break charLoop;
}
}
/*2.1找到換行符后,從上個(gè)換行符到本換行符之間的序列,填充給s*/
startChar = nextChar;
nextChar = i;
if (eol) {
String str;
/*2.1.1如果是第一次遍歷到換行符,*/
if (s == null)
{
str = new String(cb, startChar, i - startChar);
}
/*2.1.2至少遍歷到一次換行符時(shí)*/
else
{
s.append(cb, startChar, i - startChar);
str = s.toString();
}
//更新下次讀取的位置
nextChar++;
if (c == '\r') {
skipLF = true;
}
return str;
}
//2.2如果沒有換行符
if (s == null)
//類屬性int defaultExpectedLineLength = 80
s = new StringBuffer(defaultExpectedLineLength);
//填充s,從上個(gè)換行符到最后
s.append(cb, startChar, i - startChar);
}
}
}
轉(zhuǎn)自:https://blog.csdn.net/LVGAOYANH/article/details/53485758
聯(lián)系客服