1 import java.nio.*;
2 import java.util.*;
3 import static net.mindview.util.Print.*;
4
5 public class RandomWords implements Readable {
6 private int readCount = 1;//read()執行次數
7 private int loopCount = 1;
8 public RandomWords() { }
9 public int read(CharBuffer cb) {
10
11 if (loopCount == 1){print("進入read執行第" + readCount + "次");readCount++;cb.append("aa bb cc ");loopCount++;return 1;}//僅僅在第一次和第六次給CharBuffer添加3個數據
12 if (loopCount == 2){print("進入read執行第" + readCount + "次");readCount++;loopCount++;return 1;}//其餘的時候返回1,可是並不往Buffer中存放數據,來騙被調用者hasNext(),來觀察出現了什麼現象
13 if (loopCount == 3){print("進入read執行第" + readCount + "次");readCount++;loopCount++;return 1;}
14 if (loopCount == 4){print("進入read執行第" + readCount + "次");readCount++;loopCount++;return 1;}
15 if (loopCount == 5){print("進入read執行第" + readCount + "次");readCount++;loopCount++;return 1;}
16
17 if (loopCount == 6){print("進入read執行第" + readCount + "次");readCount++;cb.append("oo pp qq ");loopCount++;return 1;}
18 if (loopCount == 7){print("進入read執行第" + readCount + "次");readCount++;loopCount++;return 1;}
19 if (loopCount == 8){print("進入read執行第" + readCount + "次");readCount++;loopCount++;return 1;}
20 if (loopCount == 9){print("進入read執行第" + readCount + "次");readCount++;loopCount++;return 1;}
21 if (loopCount == 10){print("進入read執行第" + readCount + "次");readCount++;return -1;}
22 return 1;
23 }
24
25 public static void main(String[] args) {
26 int a = 1;//外層循環的次數
27
28 print("1");
29 Scanner s = new Scanner(new RandomWords())
30 print("2");
31
32
33 while(s.hasNext()){//這個hasNext()方法會調用read()方法的
34 print("第" + a + "次執行外層循環");
35 a ++;
36 System.out.println("從cb中讀出 " + s.next());
37 }
38 }
39 }
上面的執行結果是:
1
2
進入read執行第1次
第1次執行外層循環
從cb中讀出 aa
第2次執行外層循環
從cb中讀出 bb
第3次執行外層循環
從cb中讀出 cc
進入read執行第2次
進入read執行第3次
進入read執行第4次
進入read執行第5次
進入read執行第6次
第4次執行外層循環
從cb中讀出 oo
第5次執行外層循環
從cb中讀出 pp
第6次執行外層循環
從cb中讀出 qq
進入read執行第7次
進入read執行第8次
進入read執行第9次
進入read執行第10次
能夠看到,在執行到while(s.hasNext())時,要判斷是否輸入了內容,此時要進行讀取操做,調用read()函數,執行
loopCount == 1 獲得了返回值爲1,所以程序判斷有輸入內容,同時 cb.append("aa bb cc ")已經執行,因爲s.hasNext()是以空格爲間斷符
第一次只能讀aa,後面的在cd外排序等待,讀完以後執行print(),而後因爲一次性給過來的是aa bb cc。所以接着讀取bb。最後cc。
繼續執行 loopCount == 2 此時返回值仍爲1,可是s.hasNext()並未檢測到有具體內容要讀取進來,所以繼續調用read()函數,直到s.hasNext()檢測到返回值爲-1爲止,或者有讀取內容。