Java SE5的Scanner类的构造器可以接受一个Readable接口。
Scanner(Readable source)
构造一个新的 Scanner
,它生成的值是从指定源扫描的。
可以发现Readable是单独为Scanner创建的,因为Readable没用用做JAVA标准类库中其他任何方法的参数,因此Scanner不必将其参数限制为某个特定的类。
那么Readable如何用呢?
例如:
import java.io.IOException;
import java.nio.CharBuffer;
import java.util.*;
public class RandomWords implements Readable{
private static Random rand = new Random(47);
private static final char[] capitals = "ABCDEFGHIGKLMNOPQRSTUVWXYZ".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;
}
@Override
public int read(CharBuffer cb) throws IOException {
// TODO Auto-generated method stub
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){
Scanner s = new Scanner(new RandomWords(10));
while(s.hasNext()){
System.out.println(s.next());
}
}
}
运行结果如下:
Yazeruyac
Fowenucor
Goeazimom
Raeuuacio
Nuoadesiw
Hageaikux
Ruqicibui
Numasetih
Kuuuuozog
Waqizeyoy
那么可能有人会有疑问,RandomWords实现的方法read是在哪里调用的呢?? 仔细观察过后,可以发现是在s.hasNext()处调用的。
修改代码如下:
package chapter9;
import java.io.IOException;
import java.nio.CharBuffer;
import java.util.*;
public class RandomWords implements Readable{
private static Random rand = new Random(47);
private static final char[] capitals = "ABCDEFGHIGKLMNOPQRSTUVWXYZ".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;
}
@Override
public int read(CharBuffer cb) throws IOException {
// TODO Auto-generated method stub
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){
Scanner s = new Scanner(new RandomWords(10));
while(s.hasNext()){
System.out.println(s.hasNext()+","+s.next()+","+s.hasNext());
}
}
}
运行结果:
true,Yazeruyac,true
true,Fowenucor,true
true,Goeazimom,true
true,Raeuuacio,true
true,Nuoadesiw,true
true,Hageaikux,true
true,Ruqicibui,true
true,Numasetih,true
true,Kuuuuozog,true
true,Waqizeyoy,false
由于read方法中返回了-1,CharBuffer中为空值,故s.hasNext()返回了false.