通过implements(实现)Readbale interface(接口)的 read() method(方法) 实现自己添加字符到buffer里,然后读取

//策略模式
package object; //: interfaces/RandomWords.java
// Implementing an interface to conform to a method.
import java.nio.*;//Readable 接口在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) {
//read()方法来自Readable接口,Sanner()里也有用到
if(count-- == 0) return -1; // Indicates end of input
cb.append(capitals[rand.nextInt(capitals.length)]); //从cpitals里面每次读出一个字符并添加到buffer里面
for(int i = 0; i < 4; i++) {
cb.append(vowels[rand.nextInt(vowels.length)]);//从vowels里面每次读出four char 字符并添加到buffer里面
cb.append(lowers[rand.nextInt(lowers.length)]);//append()方法:添加字符到buffer里面
}
cb.append(" "); //在这里空格和'\n'功能一样
return 10; // Number of characters appended
}
public static void main(String[] args) {
Scanner s = new Scanner(new RandomWords(10));
// new RandomWords(10)可以换做任意实现了Readable接口的类所生成的对象
while(s.hasNext()) //hasNext()通过调用readInput()方法调用read()方法知道read()返回-1结束
      System.out.println(s.next());
}
} /* Output:
Yazeruyac
Fowenucor
Goeazimom
Raeuuacio
Nuoadesiw
Hageaikux
Ruqicibui
Numasetih
Kuuuuozog
Waqizeyoy
*///:~

我们再次使用了适配器模式,但在本例中,被适配的类可以通过继承和实现Readable接口来创建,因此通过使用interface关键字提供的伪多重继承机制,我们可以生产既是RandomDoubles又是Readable的新类,在这种方式中,我们可以在任何现有类之上添加新的接口,所以这意味着让方法接受接口类型,是一种让任何类都可以对该方法进行适配的方式

//: interfaces/RandomDoubles.java
package object;
import java.util.*; public class RandomDoubles {
private static Random rand = new Random(47);
public double next() { return rand.nextDouble(); }
public static void main(String[] args) {
RandomDoubles rd = new RandomDoubles();
for(int i = 0; i < 7; i ++)
System.out.print(rd.next() + " ");
}
} /* Output:
0.7271157860730044 0.5309454508634242 0.16020656493302599 0.18847866977771732 0.5166020801268457 0.2678662084200585 0.2613610344283964
*///:~

//: interfaces/AdaptedRandomDoubles.java
// Creating an adapter with inheritance.
package object;
import java.nio.*;
import java.util.*;
import object.*;
public class AdaptedRandomDoubles extends RandomDoubles
implements Readable {
private int count;
public AdaptedRandomDoubles(int count) {
this.count = count;
}
public int read(CharBuffer cb) {
if(count-- == 0)
return -1;
String result = Double.toString(next()) + " ";
cb.append(result);
return result.length();
}
public static void main(String[] args) {
Scanner s = new Scanner(new AdaptedRandomDoubles(7));
while(s.hasNextDouble())
System.out.print(s.nextDouble() + " ");
}
} /* Output:
0.7271157860730044 0.5309454508634242 0.16020656493302599 0.18847866977771732 0.5166020801268457 0.2678662084200585 0.2613610344283964
*///:~

 

//: interfaces/AdaptedRandomDoubles.java //读取字符数组
// Creating an adapter with inheritance.
package object;
import java.nio.*;
import java.util.*;
class CharSequence {
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();
char[] generate() {
char[] buffer = new char[10];
int idx = 0;
buffer[idx++] = capitals[rand.nextInt(capitals.length)];
for(int i = 0; i < 4; i++)
{
buffer[idx++] = vowels[rand.nextInt(vowels.length)];
buffer[idx++] = lowers[rand.nextInt(lowers.length)];
}
buffer[idx] = ' ';
return buffer;
}
}
class E16_AdaptedCharSequence extends CharSequence
implements Readable {
private int count;
public E16_AdaptedCharSequence(int count) {
this.count = count;
}
public int read(CharBuffer cb) {
if(count-- == 0)
return -1; // Indicates end of input
char[] buffer = generate();
cb.put(buffer); //将buffer字符数组输出到流
return buffer.length;
}
public static void main(String[] args) {
Scanner s =
new Scanner(new E16_AdaptedCharSequence(10));
while(s.hasNext())
System.out.println(s.next());
}
}

Java Scanner Readable的更多相关文章

  1. java Scanner与BufferedReader读取键盘输入性能比较

    java  Scanner与BufferedReader读取键盘输入性能比较            1.Scanner和BufferedReader 性能比较 在java中常见的从键盘获取输入的方式有 ...

  2. Java-Runoob:Java Scanner 类

    ylbtech-Java-Runoob:Java Scanner 类 1.返回顶部 1. Java Scanner 类 java.util.Scanner 是 Java5 的新特征,我们可以通过 Sc ...

  3. java Scanner和异常

    Java Scanner 类 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. 下面是创建 Scanner 对象的基本语法: Scann ...

  4. Java Scanner用法详解

    一.Scanner类简介 Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序.它是以前的StringTokenizer和Matcher类之间的某种结合.由于 ...

  5. Java Scanner类

    package io; import java.util.*; public class useScanner { public static void main(String[] args) { S ...

  6. JAVA Scanner的简单运用

    package Code428; import java.util.Scanner; /*Scanner 可以实现键盘输入数据 引用的步骤1.import 包路径.类名称只有java.lang包下的内 ...

  7. Java Scanner 类

    下面是创建 Scanner 对象的基本语法: Scanner s = new Scanner(System.in); Scanner -是java类库的一个基础类,一个可以使用正则表达式来解析基本类型 ...

  8. Java Scanner篇

    Scanner 翻译解释为扫描器 Java中用于控制台的的数据输入 包:import java.util.Scanner 使用方法:Scanner reader=new Scanner(System. ...

  9. java Scanner中next和nextLine()区别

    next(): 1.一定要读取到有效字符后才可以结束输入. 2.对输入有效字符之前遇到的空白,next() 方法会自动将其去掉. 3.只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符. ne ...

随机推荐

  1. 爆打团队 四则运算 beta视频

    爆打团队 四则运算 beta视频链接 http://v.youku.com/v_show/id_XMTU1MjAzNDI0NA==.html?from=s1.8-1-1.2

  2. Java之数据流-复制二进制文件

    package test_demo.fileoper; import java.io.*; /* * 数值字节流操作,复制二进制文件 * 输入流:从文件中读取数据,扩展为数据流(二进制) * 输出流: ...

  3. 轻松学JVM

    轻松学JVM(一)——基本原理 前言 JVM一直是java知识里面进阶阶段的重要部分,如果希望在java领域研究的更深入,则JVM则是如论如何也避开不了的话题,本系列试图通过简洁易读的方式,讲解JVM ...

  4. ssm 整合 redis(简单教程)

    最后我建议大家使用 Spring StringRedisTemplate 配置,参阅: http://blog.csdn.net/hanjun0612/article/details/78131333 ...

  5. (转)Java随机数

    1 随机数的三种产生方式 本章先讲解Java随机数的几种产生方式,然后通过示例对其进行演示. 广义上讲,Java中的随机数的有三种产生方式: (01). 通过System.currentTimeMil ...

  6. Java中list如何利用遍历进行删除操作

    转: Java中list如何利用遍历进行删除操作 2018年03月31日 10:23:41 Little White_007 阅读数:3874   Java三种遍历如何进行list的便利删除: 1.f ...

  7. HDU 6153 扩展kmp

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others)Total ...

  8. Python远程连接模块-Telnet

    Python远程连接模块-Telnet 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 虽然现在主流的python版本还是2.7,相信2020年python程序员都会偏向Python ...

  9. python操作txt文件中数据教程[3]-python读取文件夹中所有txt文件并将数据转为csv文件

    python操作txt文件中数据教程[3]-python读取文件夹中所有txt文件并将数据转为csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 python操作txt文件中 ...

  10. git高清技能图

    ----