Decorator设计模式
在程序中用一个对象(the Decorators)包装另外一个对象,这是一种被称为Decorator的设计模式。
如果要设计自己的IO包装类,这个类需要继承以FilterXXX命名的类,例如,设计一对输入输出包装类:RecordInputStream和RecordOutputStream,来完成从数据库文件中读取记录和往数据库文件中写入记录。
TestPrintWriter.java:
import java.io.*;
public class TestPrintWriter {
public static void main(String[] args) {
try{
throw new Exception("test");
} catch (Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
System.out.println(e.getMessage());
//System.out.println(sw.toString());
}
}
}
思考与实践:
1 编写一个程序,将一个目录及其子目录下的所有txt类型的文本文件中的内容合并到若干个新的文本文件中,当第一个新产生的文件中存储的内容达到1Mbytes时,剩下的内容存储到第二个新的文件中,依次住下,新产生的文本文件名依次为1.txt、2.txt、......。
思路:
(1) 把目录下所有的文件取出来。
(2) 把文件写入新文件中。
2 用自己的话叙述什么是流,什么节点流,什么是包装类。
3 编写一个函数,把StringReader输入流中所有英文字母变成大写字母,并将结果写入到一个StringWriter输出流对象中。然后,用这个函数将一个字符串中的所有字符转换成大写。
4 用记事本程序创建一个内容只有“中国”这两个字符的文本文件,然后用不同的编码格式分别保存这个文本文件。用UntralEdit打开这些不同编码格式的文件,并用十六进制方式查看它们的内容,结合你所看到的内容来叙述各种编码格式之间的差异。
5 编写下面的程序代码,分析和观察程序的运行结果:
import java.io.*;
public class InputReader{
public static void main (String [] args ) throws Exception{
InputStreamReader isr = new InputStreamReader(System.in, "so8859-1");
BufferedReader br = new BufferedReader(isr);
String strLine = br.readLine();
for(int i = 0; i < strLine.length(); i ++) {
System.out.println(Integer.toHexString(int)strLine.charAt(i));
}
isr.close();
System.out.println(strLine);
}
}
输入“中国”后,程序的运行结果如下:
d6
d0
b9
fa
???u
请按下面的两种要求修改上面的程序代码,让程序能够正常打印出输入的中文字符。
(1)修改程序中的语句:
InputStreamReader isr = new InputStreamReader(System.in, "so8859-1");
(2)不修改上面的语句,而是修改下面的语句:
System.out.println(strLine);