• (JAVA)从零开始之--打印流PrintStream记录日志文件


    这里的记录日志是利用打印流来实现的。

    文本信息中的内容为String类型。而像文件中写入数据,我们经常用到的还有文件输出流对象FileOutputStream.

    1 File file = new File("F:\a.txt");
    2 FileOutputStream outputStream = new FileOutputStream(file,true);//第二个参数为追加文本
    3 outputStream.write(97);

    上面的代码执行完之后,a.txt中的内容存的是a,因为write方法接收的为byte类型的数据,97对应的ASCII码为a。

    假设我就想将97写入到文件中呢?那么得将第三行代码改为

    1 outputStream.write("97".getBytes());//先将97作为字符串再转换为byte数组

    而PrintStream得出现,是的我们写数据入文件变得十分方便,你传入的是什么,就会给你写入什么数据。原因是他内部帮我们转换活了

    1 File file = new File("F:\a.txt");
    2 PrintStream printStream = new PrintStream(file);
    3 printStream.println(97);
    4 printStream.println('a');
    5 printStream.println("hello world");
    6 printStream.println(true);
    7 printStream.println(3.14);
    8 printStream.println(new Student("酒香逢")); 

    上面这段代码得到的结果为:

    可见不管什么数据类型,都会转换为字符串,甚至是对象也不例外。

    这里再说一下学习java时少不了用到的一句代码:System.out.println();代码中的out,为System类中的一个PrintStream对象,称之为标准输出流对象。标准输出流对象会将数据打印到控制台上。查阅API可知有如下方法,

    static void setOut(PrintStream out) //重新分配“标准”输出流

    可以重新指定输出流对象,即将System.out.println();的输出内容打印到我们想打印到的地方。

    1 File file = new File("F:\a.txt");
    2 PrintStream printStream = new PrintStream(file);
    3 System.setOut(printStream);
    4 System.out.println("打印到F:\a.txt中");

    这时候内容回写入到文件a.txt中去,而不是打印在控制台中。

    最后回归本文重点,日志信息的保存。

    假设有代码:

    1 try{
    2    int n = 5/0;
    3 }catch(Exception e){
    4    e.printStackTrace();
    5 }

    执行结果会抛出我们想要的错误日志信息。

    java.lang.ArithmeticException: / by zero
        at log.DemoLog.main(DemoLog.java:26)

    这时候想将日志信息保存起来怎么办呢?

    看到Exception类中的这3个重载方法,我们不难得知,只要给他指定一个打印输出流对象当中,即可将日志信息保存到我们想要的地方。

    1 File file = new File("F:\a.log");
    2         PrintStream printStream = new PrintStream(file);
    3         try{
    4             int n = 5/0;//除数为零异常
    5         }catch(Exception e){
    6             e.printStackTrace(printStream);
    7         }

    上面这段代码执行重复执行多次,

    但是记录的日志信息永远只会记录一条。这明显不是我们想得到的,日志信息,总不能只记录一条吧?那么它存在又有什么用?

    其实,追加文本信息的决定者不是e.printStackTrace(printStream);方法,关键点在于流对象,

    可见打印流对象是存在一个OutputStream接口作为参数的传入对象。既然是接口,那么就无法new出OutputStream的对象了,可以用他的子类FileOutputStream对象作为参数传入。并且,FileOutputStream流是可以追加的,

    new FileOutputStream(file,true);//第二个参数为追加文本

    此时将其作为参数传入,PrintStream流自然也就可以追加内容了。

    1 File file = new File("F:\a.log");
    2         PrintStream printStream = new PrintStream(new FileOutputStream(file,true),true);
    3         try{
    4             int n = 5/0;//除数为零异常
    5         }catch(Exception e){
    6             e.printStackTrace(printStream);
    7         }

    将代码执行3次后:

    可以看到日志信息是保存有3条的,日志信息记录保存目的达成!
  • 相关阅读:
    [ Algorithm ] N次方算法 N Square 动态规划解决
    [ Algorithm ] LCS 算法 动态规划解决
    sql server全文索引使用中的小坑
    关于join时显示no join predicate的那点事
    使用scvmm 2012的动态优化管理群集资源
    附加数据库后无法创建发布,error 2812 解决
    浅谈Virtual Machine Manager(SCVMM 2012) cluster 过载状态检测算法
    windows 2012 r2下安装sharepoint 2013错误解决
    sql server 2012 数据引擎任务调度算法解析(下)
    sql server 2012 数据引擎任务调度算法解析(上)
  • 原文地址:https://www.cnblogs.com/fnz0/p/5423201.html
Copyright © 2020-2023  润新知