Java经典编程例题(二)

 

1、重定向输出流实现程序日志

System类中的out成员变量是Java的标准输出流,程序长用它来输出调试信息。out成员变量被定义为final类型的,无法直接重新复制,但是可以通过setOut()方法来设置新的输出流。

要求:创建redirect类,编写该类的main()主方法,在该方法中保存System类的out成员变量为临时变量,然后创建一个新的文件输出流,并把这个输出流设置为System类新的输出流。在程序关键位置输出调试信息,这些调试信息将通过新的输出流保存到日志文件中,最后恢复原有输出流并输出程序运行结束信息。



import java.io.FileNotFoundException;
import java.io.PrintStream;
public class redirect {

public static void main(String[] args) {
try {
PrintStream out=System.out; //保存原输出流
PrintStream ps=new PrintStream("./log.txt"); //创建文件输出流
System.setOut(ps); //设置使用新的输出流
int age=18;
System.out.println("年龄变量成功定义,初始值为18");
String sex="女";
System.out.println("性别变量成功定义,初始值为女");
//整合两个变量
String info="这是个"+sex+"孩子,应该有"+age+"岁了。";
System.out.println("整合两个变量为info字符串变量,其结果是:"+info);
System.setOut(out); //恢复原有输出流
System.out.println("程序运行完毕,请查看日志文件。");

}catch(FileNotFoundException e) {
e.printStackTrace();
}
}

}


 

Day9---学习Java第三弹_数据

 

输出到桌面的 log.txt中的内容为:

年龄定义,初始值18

性别定义,女

整合了两个变量这是一个女孩子年龄为18

 

对于输出结果的详解析:

1.PrintStream out=System.out;

创建一个打印流out,此流已打开并准备接受输出数据。

2.PrintStream ps = new PrintStream("C:\\...");

创建又一具有指定文件名的打印流ps(不带自动刷新)

3.System.setOut(ps); //若去掉此句,则内容都会在console面板中输出

重新分配“标准”输出流,重定向输出到ps对象中(即指定路径名文件中)

4.System.out.println("年龄定义,初始值18");

在已定向的输出路径中打印输出字符串内容

5.System.setOut(out);

重定向输出到out对象中(即屏幕上)


 

-------------------------------------------------------------------------------------------------------------------------------------------------------

Java-Java I/O流解读之java.io.PrintStream & java.io.PrintWriter

JavaI/O流分为两类,字节流和字符流。

字节流是指InputStream/OutputStream及其子类,

字符流是指Reader/Writer及其子类。

 

这两类I/O流的class hierarchy基本上是对等的,InputStreamReader/OutputStreamWriter是InputStream/OutputStream和Reader/Writer之间的桥梁。

 

 

PrintStream是OutputStream的子类,PrintWriter是Writer的子类,两者处于对等的位置上.

 

 Day9---学习Java第三弹_数据_02

 

 

PrintStream 在 OutputStream 基础之上提供了增强的功能 , 即可以方便的输出各种类型的数据 ( 而不仅限于 byte 类型 ).PrintStrem 的方法从不抛出 IOException.

 

Printwriter 提供了 PrintStream 的所有打印方法 , 其方法也从不抛出 IOException

 

与 PrintStream 的区别 : 作为处理流使用时 ,PrintStream 只能封装 OutputStream 类型的字节流 , 而 PrintWriter 既可以封装 OutputStream, 也能封装 Writer 类型的字符输出流并增强其功能 .

 

一个字符(char)是16bit,一个BYTE是8bit.

 

PrintStream是写入一串8bit的数据。

PrintWriter是写入一串16bit的数据。

 

基于字节的java.io.printSteam支持方便的打印方法,如print()和println(),用于打印原语和文本字符串。

 

在JDK 1.5中引入了printf()和format(),用于符格式化输出。 printf()和format()是一样的。

 

PrintStream不会抛出IOException。相反,它设置一个可以通过checkError()方法检查的内部标志。还可以创建一个PrintStream来自动刷新输出。也就是说,flush()方法在写入一个字节数组之后被自动调用,其中一个println()方法被调用,或者在一个换行符(’\ n’)被写入之后。

 

标准输出和错误流(System.out和System.err)属于PrintStream。

 

PrintStream打印的所有字符都将使用默认字符编码转换为字节。在需要编写字符而不是字节的情况下,应使用PrintWriter类。

 

字符流PrintWriter类似于PrintStream,除了它以字符而不是字节编写。 PrintWriter还支持print(),println(),printf()和format()的所有方便的打印方式。它不会抛出IOException,并且可以选择创建以支持自动刷新。