======Readable是java.lang里面的一個(gè)接口,它是一個(gè)字符源。閱讀方法的調(diào)用能夠通過(guò)CharBuffer使用Readable的字符。
======該接口只有一個(gè)方法,int read(CharBuffer cb).
======該接口是單獨(dú)為Scanner創(chuàng)建的,以使得Scanner不必將參數(shù)局限為某個(gè)特定的類,因此,通過(guò)這種方式,Scanner不僅僅能從String,File,imputStream中讀入數(shù)據(jù),而且可以從任何繼承自Readable的類中讀入!
======================================來(lái)看一個(gè)程序=========================================
import java.nio.*;
import java.util.*; public class RandomWords implements Readable {
private static Random rand = new Random(47); private static final char[] capitals = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); private static final char[] lowers = "abcdefghijklmnopqrstuvwxyz".toCharArray(); private static final char[] vowels = "aeiou".toCharArray(); private int count; public RandomWords(int count) { this.count = count; } public int read(CharBuffer cb) { //這里覆蓋Readable的read方法 //把判斷語(yǔ)句放在最前面,一執(zhí)行,條件就成立的話CharBuffer中沒有字符,調(diào)用hasNext就會(huì)返回假 if(count-- == 0) return -1; // Indicates end of input cb.append(capitals[rand.nextInt(capitals.length)]); for(int i = 0; i < 4; i++) { cb.append(vowels[rand.nextInt(vowels.length)]); cb.append(lowers[rand.nextInt(lowers.length)]); } cb.append(" "); /*用空格來(lái)做為定界符,把CharBuffer中的字符在空格處裁開,這樣子就會(huì)得到數(shù)個(gè)next()值 */ return 10; // Number of characters appended } public static void main(String[] args) { Scanner s = new Scanner(new RandomWords(10)); while(s.hasNext()) System.out.println(s.next()); } } /* Output: Yazeruyac Fowenucor Goeazimom Raeuuacio Nuoadesiw Hageaikux Ruqicibui Numasetih Kuuuuozog Waqizeyoy *///:~ 問(wèn)題1:read()返回的是 int型,這個(gè)int表示什么?
-- >這個(gè)int只要不等于-1,read()就會(huì)一直被調(diào)用,直到read()拋出異?;蛘遰eturn -1 ! 問(wèn)題1:當(dāng)用Scanner.hasNext()時(shí),是根據(jù)read的返回值來(lái)判斷hasNext()的真假嗎?
-- >這個(gè)程序中,hasNext()是根據(jù)CharBuffer中是否有字符串來(lái)判斷真假的!與read()的返回值無(wú)關(guān). 問(wèn)題1:cb.append(" "); //這句有什么作用?
-- > 在默認(rèn)的情況下,hasNext()是通過(guò)空白符來(lái)劃分界限的,此句的作用就是,為CharBuffer中的字符串添加空白符! 問(wèn)題1:return 10; //這里改成return 3或2等正數(shù),為什么程序的輸出結(jié)果都是一樣的呢? -- >read方法的返回值只是一個(gè)標(biāo)記,沒有副作用(只要返回值是除-1外的任何數(shù),不管返回的是什么數(shù),結(jié)果都一樣!),不會(huì)影響緩沖區(qū)的輸出結(jié)果 ============================總結(jié):====================================== 第一:當(dāng)創(chuàng)建Scanner對(duì)象,并把它與Readable并聯(lián)時(shí)(如Scanner s = new Scanner(new RandomWords(10));),就會(huì)自動(dòng)調(diào)用Readable的read(),只要從read()方法中返回的值不是 -1
,那么就會(huì)不停的調(diào)用read(),直到從read()中返回 -1 或者 拋出異常! 第二:調(diào)用Scanner.hasNext()時(shí),是看CharBuffer里面有沒有字符,如果有就返回ture,值得注意的是,在read()里面應(yīng)該添加語(yǔ)句:cb.append(" "); 即用空格來(lái)做為定界符,把CharBuffer中的字符在空格處裁開并做為下一次hasNext()判定字符是否為空的起始位置! |
|
來(lái)自: 鳳舞天煌 > 《JAVA技術(shù)》