Java有两种类型的输入类:字节流和字符流。字节流以字节(8bit)为单位,包含两个抽象类:InputStream和OutputStream。字符流以字符(16bit)为单位,包含两个抽象类Reader和Writer。
假如现在要设计一个输入流类,该类的作用为在读文件时,将大写字母转化为小写字母,将小写字母转化为大写字母。在设计时可以通过继承抽象装饰者类(FilterInputStream)来实现一个装饰类。通过调用InputStream类或其他子类提供的一些方法再加上逻辑判断代码从而可以很简单地实现这个功能。
FilterInputStream 的作用是用来“封装其它的输入流,并为它们提供额外的功能”。它的常用的子类有BufferedInputStream和DataInputStream。
示例如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
//自定义输入类
class MyOwnInputStream extends FilterInputStream{
/**重写read方法*/
@Override
public int read() throws IOException {
int c = 0;
if((c=super.read()) != -1){
//将小写转换为大写
if(Character.isLowerCase(c)){
return Character.toUpperCase(c);
}else if(Character.isUpperCase(c)){//大写转化成小写
return Character.toLowerCase(c);
}else{
return c;
}
}else{
return -1;
}
}
/**这个构造函数一定要有*/
protected MyOwnInputStream(InputStream arg0) {
super(arg0);
}
}
public class Test {
public static void main(String[] args) {
//指定文件目录 方法一
//String path = System.getProperty("user.dir");
//File file = new File(path+"/text.txt");
//方法二,直接从project目录下面找文件
File file = new File("text.txt");
int c = 0;
try {
InputStream inputStream = new MyOwnInputStream(new FileInputStream(file));
while((c=inputStream.read()) != -1){
System.out.print((char)c);
}
inputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
text.txt的内容为:aaaBBBcccDDD123
则输出为:AAAbbbCCCddd123
转自《Java程序员 面试笔试》