说明:这是java经典编程实例300中的第13个实例,主要是为了说明使用setOut()方法来设定新的输出流。因为out成员变量被定义为final类型的,无法直接重新复制,故可以通过setOut()方法来来设置新的输出流。
程序:
package char3;
import java.io.FileNotFoundException;
import java.io.PrintStream;
public class RedirectOutputStream {
publicstatic void main(String args[] ){
try{
PrintStreamout=System.out;
PrintStreamps=new PrintStream("/log.txt");
intage=18;
System.out.println("年龄变量成功电议,初始值为18");
Stringsex="女";
System.out.println("性别变量定义成功,初始值为女");
Stringinfo="这个"+sex+"孩子,应该有"+age+"岁了";
System.out.println("整合两个变量为info字符串变量,其结果是:");
System.out.println(out);
System.out.println("程序运行完毕,请查看日志文件。");
}
catch(FileNotFoundExceptione){
e.printStackTrace();
}
}
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(这里故意没有使用SetOut())
System.out.println("整合两个变量为info字符串变量,其结果是:");
System.out.println(out);
System.out.println("程序运行完毕,请查看日志文件。");
输出结果:
年龄变量成功电议,初始值为18
性别变量定义成功,初始值为女
这个"+sex+"孩子,应该有"+age+"岁了
整合两个变量为info字符串变量,其结果是:
java.io.PrintStream@1db9742
程序运行完毕,请查看日志文件。
修改程序:
System.setOut(out);
这一次应该准确的复现书本程序了吧?
年龄变量成功电议,初始值为18
性别变量定义成功,初始值为女
这个"+sex+"孩子,应该有"+age+"岁了
整合两个变量为info字符串变量,其结果是:
程序运行完毕,请查看日志文件。 ????
这是为什么?查找原因中………….
找到了:
PrintStreamout=System.out;
PrintStream ps=new PrintStream("/log.txt");
intage=18;
System.out.println("年龄变量成功电议,初始值为18");
这里应该:
PrintStreamps=new PrintStream("/log.txt");
System.setOut(ps);
intage=18;
把这个鬼鬼祟祟的System.setOut(ps);给丢掉了。
然后就是这个样子了:
程序运行完毕,请查看日志文件。
可是不对啊,那个日志呢?好,看看日志去哪了……
桌面没有…….(开个玩笑)
找log的文件去..........
年龄变量成功电议,初始值为18
性别变量定义成功,初始值为女
整合两个变量为info字符串变量,其结果是:
程序这就运行完毕了,但是要学习点东西啊,好吧,我去查资料去:
setOut()方法---该方用于虫子分配System类的标准输出流。
声明:public static voidsetOut(printStream out)
setErr()方法
该方法重新分配System类的标准错误输出流。
声明:public static void setErr(PrintStream err)
setLn()方法—该发放将重新设置System类的in成员变量,即标准输入流。
声明:public static void setIn(inputStream in)
PrintStream:
是一个字节打印流,System.out对应的类型就是PrintStream。
它的构造函数函数可以接收三种数据类型的值。
1,字符串路径。
2,File对象。
3,OutputStream。
PrintWriter:
是一个字符打印流。构造函数可以接收四种类型的值。
1,字符串路径。
2,File对象。
对于1,2类型的数据,还可以指定编码表。也就是字符集。
关于InputStream.read()
在从数据流里面读取数据时,经常使用InputStream.read()方法,从流里面每次读取一个字节,效率非常低。最好使用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次读取多个字节。
(ps:本身文章里边都是截图的,可是没法直接复制进去,悲剧)