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

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

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

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

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

 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();的输出内容打印到我们想打印到的地方。

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

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

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

假设有代码:

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

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

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

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

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

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

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

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

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

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

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

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

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

将代码执行3次后:

可以看到日志信息是保存有3条的,日志信息记录保存目的达成!

(JAVA)从零开始之--打印流PrintStream记录日志文件的更多相关文章

  1. 系统学习 Java IO (十一)----打印流 PrintStream

    目录:系统学习 Java IO---- 目录,概览 PrintStream 类可以将格式化数据写入底层 OutputStream 或者直接写入 File 对象. PrintStream 类可以格式化基 ...

  2. IO流(五)__文件的递归、Properties、打印流PrintStream与PrintWriter、序列流SequenceInputStream

    一.文件的遍历 1.需求:对指定目录进行所有的内容的列出(包含子目录的内容)-文件的深度遍历 思想:递归的思想,在递归的时候要记住递归的层次. public class FileTest { publ ...

  3. java 打印流 递归复制子文件子文件夹 不同编码文件复制到同一文件中 序列化流反序列化流

    package com.swift.jinjie; import java.io.BufferedInputStream; import java.io.File; import java.io.Fi ...

  4. java 中的打印流

    package cn.zhou; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.F ...

  5. 打印流PrintStream

    打印流PrintStream PrintStream extends OutputStream 1.打印流的特点 只负责数据的输出,不负责数据的读取 与其他的流不同,打印流永远不会抛出IOExcept ...

  6. 打印流-PrintStream

    打印流-PrintStream java.io.PrintStream为其他输出流添加了功能,使其他的流能够更方便的打印各种数据值表现形式 PrintStream特点: 1.只负责数据的输入,不负责数 ...

  7. Java基础教程——打印流

    打印流 打印流可以把原本输出到控制台的信息输出到文件中.PrintStream是字节打印流(还有个对应的字符打印流是PrintWriter,这里不涉及) System类中有个变量: public fi ...

  8. (23)IO之打印流 PrintStream & Printwriter

    PrintStream PrintStream可以接受文件和其他字节输出流,所以打印流是对普通字节输出流的增强,其中定义了很多的重载的print()和println(),方便输出各种类型的数据. Pr ...

  9. 打印流-PrintStream和PrintWriter

    概念: 打印流是输出信息最方便的类,注意包含PrintStream(字节打印流)和 PrintWriter(字符打印流).打印流提供了非常方便的打印功能,可以打印任何类型的数据信息,例如:小数,整数, ...

随机推荐

  1. Linux下文件轻松比对,自由开源的比较软件

    文件比较工具用于比较计算机上的文件的内容,找到他们之间相同与不同之处.比较的结果通常被称为diff. diff同时也是一个基于控制台的.能输出两个文件之间不同之处的著名的文件比较程序的名字.diff是 ...

  2. Activity声明周期容易出现的问题

    了解activity的生命周期,不仅仅是回答面试官的几个小问题:下面这篇文章不错,截取个人认为优秀的部分分享给大家,欢迎交流.感谢原作者 /** * 示例向我们展示了在 Activity 的配置改变时 ...

  3. Selenium 前期学习

    一.了解selenium必读文档: 官方文档:http://docs.seleniumhq.org/docs/03_webdriver.jsp 二.公司使用c#开发,配合开发的要求,使用visual ...

  4. 【转】Markus Persson:Minecraft 游戏背后的奇才

    转自酷勤网 Markus Persson是沙盒游戏Minecraft的开发者,在游戏中以Notch的名字为众多玩家所知,是游戏界绝对的巨星.美国<滚石>杂志的专栏作家David Peisn ...

  5. there be 句型

    there be 意思:表示存在或者发生. 英文释义:used to show that sth exists or happens 如果现在进行时,单数时用is,复数时用are. 现在我问你一个问题 ...

  6. .\Obj\main.axf: Error: L6406E: No space in execution regions with .ANY selector matching sin_i.o(.co

    这个问题原因是 芯片的 空间不足 解决方法是  在KEIL 的DEVICE中选择 更大的空间的芯片型号

  7. 使用Spring-data-redis操作Redis的Sentinel

    介绍 Spring-Data-Redis项目(简称SDR) 是对Redis的Key-Value数据存储操作提供了更高层次的抽象,提供了一个对几种主要的redis的Java客户端(例 如:jedis,j ...

  8. volley使用与解析(一)

    1.什么是volley Volley是google发布的基于Android平台上的网络通信库,能使网络通信更快,更简单,更健壮.获取地址:git clone https://android.googl ...

  9. 使用jq工具在Shell命令行处理JSON数据

    由于近期要处理一些 JSON 数据格式.一大早经过一番搜索后,终于找到了 jq 这个非常棒的工具.jq 同意你直接在命令行下对 JSON 进行操作,包含分片.过滤.转换等等. 首先在mac下安装jq. ...

  10. 亿图图示专家v7.7破解版

    软件简介 亿图图示专家是一款综合矢量绘制软件,新颖小巧,功能强大,可以很方便的绘制各种专业的流程图.组织结构图.网络拓扑图.思维导图.商业图表.科学设计图等.轻轻松松绘制各种专业流程图,网络图,思维导 ...