zoukankan      html  css  js  c++  java
  • (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条的,日志信息记录保存目的达成!
  • 相关阅读:
    一个php soap的错误记录
    Android 开发有哪些新技术出现?
    每个PHP开发者都应该看的书
    30 个 PHP 的 Excel 处理类
    PHP Session可能会引起并发问题
    PHP代码优化技巧大盘点
    分析和解析PHP代码的7大工具
    关于 PHP 7 你必须知道的五件事
    PHP也20岁了
    PHP高级特性二之文件处理
  • 原文地址:https://www.cnblogs.com/fnz0/p/5423201.html
Copyright © 2011-2022 走看看