import java.nio.CharBuffer;
import java.util.Random;
import java.util.Scanner;
public class RandomWords implements Readable{ /**
 * @param args
 */
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){ if(count--==0)
return -1;
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(" ");
return 10;
}

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(new RandomWords(10));
while(s.hasNext()){
System.out.println(s.next());
} }
}//public int read(CharBuffer cb)为什么会被调用,被谁调用的.

解决方案 »

  1.   

    运行的结果是:
    Yazeruyac
    Fowenucor
    Goeazimom
    Raeuuacio
    Nuoadesiw
    Hageaikux
    Ruqicibui
    Numasetih
    Kuuuuozog
    Waqizeyoy
      

  2.   

    main->Scanner.hasNext()->Scanner.readInput()->Test.read()
    没仔细看你的程序到底干什么的,你只要在read()方法中添加如下代码块: try{
               throw new Exception("test");
         }catch(Exception e){
               e.printStackTrace();
               
         }测试一下方法的调用堆栈就知道怎么调用的了.
      

  3.   

    Scanner(Readable source) 
              构造一个新的 Scanner,它生成的值是从指定源扫描的。首先查看
    Scanner类,发现它的构造函数可以接收一个实现了Readable接口的类的对象.
    然后当你使用了s.next()的时候就会调用Readable接口的public int read(CharBuffer cb)这个方法,这些算是JDK里的,如果你想要更深入去理解可以看看JDK的源代码.
    相对的线程中有一个Runnable接口,它里边有一个run()方法,某个AA实现了Runnable接口,就可以new Thread(new AA());去启动一个线程,然后这个线程就会调用AA中的run方法."你想使用我(Scanner ),那么请你按照我的规则来做(实现接口Readable),我肯定会调用这个接口中的方法(public int read(CharBuffer cb))"
      

  4.   

    这个我觉得应该是Scanner.readinput自动扫描的结果..
    import java.nio.CharBuffer; 
    import java.util.Random; 
    import java.util.Scanner; 
    import java.io.StringReader;
    import java.io.File;public class RandomWords implements Readable{ /** 
    * @param args 
    */ 
    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){ if(count--==0) 
    return -1; 
    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("    "); 
    return 1; 
    } public static void main(String[] args) throws Exception{ 
    // TODO Auto-generated method stub 
    Scanner s = new Scanner(new RandomWords(10)); 
    while(s.hasNext()){ 
    System.out.println("121212");
    System.out.println(s.next()); 

    RandomWords rw = new RandomWords(5);
    Scanner s1 = new Scanner(new StringReader(String.valueOf(capitals))); //从指定源自动扫描
    while(s1.hasNext()){
    System.out.println("*****");
    System.out.println(s1.next()); 
    } Scanner s2 = new Scanner(new File("TestStudent.java")); //它去自动地扫描文件
     while(s2.hasNext()){
      System.out.println(s2.next()); 
      } } 

      

  5.   

    readInput()是Scanner类的一个私有的方法,用来接受数据源数据,当你使用到hasNext()与next()方法时都会去调用readInput()在数据源还没有关闭的情况下.