PrintStream(打印流)   打印流可以打印任意类型的数据,而且打印前都会把数据转换成字符串再进行打印(就是把数据存入硬盘中)

编码与解码图例:

下面我们来看看一个简单的字节输出流

public class Demo1 {
public static void main(String[] args) throws IOException {
File file = new File("D:\\新建文件夹\\a.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(97);
     fileOutputStream.close();
}
}

最后我们查看记事本会发现我们存储的是字符串a,但是我们存入的数字97。原来记事本把这个数字当成了码值,因为记事本本身带有解码的功能,当我们存储int类型的数据的时候(FileOutputStream并没有对这个进行编码,它也把这个当成了码值),记事本会自动把数字转换成对应的字符,存储到记事本上面

如果我们想要存储97,只能先把这个变成一个String类型的数据存储,因为write接受一个字节类型数据,所以我们要使用String类的getBytes()方法把字符97转换成对应的码值(编码)后再存储到记事本上面,然后记事本再进行解码,这个我们就可以看到97这个数字了,例如下面

public class Demo1 {
public static void main(String[] args) throws IOException {
File file = new File("D:\\新建文件夹\\a.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write("97".getBytes());
     fileOutputStream.close();
}
}

我们再来看看一个简单的字符输出流

public class Demo1 {
public static void main(String[] args) throws IOException {
File file = new File("D:\\新建文件夹\\a.txt");
FileWriter fileWriter = new FileWriter(file);
fileWriter.write(97);
fileWriter.close();
}
}

我们可以发现记事本上面显示的是a,这个可以证明FileWriter 对于存储int类型的数据并没有进行编码,最后才会导致记事本自动解码显示为a(a编码后就是97)

但是当我们给write方法传入一个字符且不进行编码的时候,我们会发现记事本上面记录的是97,这个说明FileWriter内部对字符进行了编码,最后才导致记事本解码为97

public class Demo1 {
public static void main(String[] args) throws IOException {
File file = new File("D:\\新建文件夹\\a.txt");
FileWriter fileWriter = new FileWriter(file);
fileWriter.write("97");
fileWriter.close();
}
}

总结上面的一些实例,我们可以发现无论是字节输出流,还是字符输出流,都需要把我们需要传入的数据转换成字符类型进行传输,如果我们要传入int类型的数据感觉很麻烦,因为字节也就是码值这个也是int类型

PrintStream(打印流)   打印流可以打印任意类型的数据,而且打印前都会把数据转换成字符串再进行打印(就是把数据存入硬盘中)

使用PrintStream打印流可以让我们放心的传入任何类型的数据(包括对象和数组),不需我们手动转换成字符类型,它内部就可以帮我们把数据转换成字符串,并把字符串编码,很方便

注意:PrintStream内部维护了一个字节数组,当我们使用write的时候是把数据存储到了字节数组中,并不是打印到文件中
当我们使用flush,close方法或者数组满了的时候,才会打印到文件中

  

PrintStream的构造方法:

PrintStream(File file)
          创建具有指定文件且不带自动行刷新的新打印流。
PrintStream(File file, String csn)
          创建具有指定文件名称和字符集且不带自动行刷新的新打印流。
PrintStream(OutputStream out)
          创建新的打印流。
PrintStream(OutputStream out, boolean autoFlush)
          创建新的打印流。
PrintStream(OutputStream out, boolean autoFlush, String encoding)
          创建新的打印流。
PrintStream(String fileName)
          创建具有指定文件名称且不带自动行刷新的新打印流。
PrintStream(String fileName, String csn)
          创建具有指定文件名称和字符集且不带自动行刷新的新打印流。

PrintStream的一些方法:

print(boolean b)
          打印 boolean 值。(这个方法有很多重载,这个是为什么我们可以传入很多数据的原因)
println(boolean x)
          打印 boolean 值,然后换行。(这个方法有很多重载,这个是为什么我们可以传入很多数据的原因)
flush()
          刷新该流的缓冲,就是把内部数组中的数据打印到文本中
close()
          关闭流。

下面是一些实例:

传入int类型的97

public class Demo1 {
public static void main(String[] args) throws IOException {
File file = new File("D:\\新建文件夹\\a.txt");
PrintStream printStream = new PrintStream(file);
printStream.print(97);
printStream.close();
}
}

传入一个对象

class People{
String name;
char sex; public People(String name,char sex) {
this.name = name;
this.sex = sex;
} @Override
public String toString() {
return "姓名:"+this.name+" 性别:"+this.sex+"";
}
} public class Demo1 {
public static void main(String[] args) throws IOException {
File file = new File("D:\\新建文件夹\\a.txt");
PrintStream printStream = new PrintStream(file);
printStream.print(new People("张三",'男'));
printStream.close();
}
}

注意:如果我们要在原有的数据上面追加数据,那么我们就要使用另一个构造方法PrintStream(OutputStream out)例如:

这一次我使用了println方法,换行

public class Demo1 {
public static void main(String[] args) throws IOException {
for (int i = 0; i < 2; i++) {
File file = new File("D:\\新建文件夹\\a.txt");
PrintStream printStream = new PrintStream(new FileOutputStream(file,true));
printStream.println(new People("张三",'男'));
printStream.close();
}
}
}

我们一直在使用System.out.println()往控制台输出信息,那么我们如何在指定的地方输出我们的信息而不在控制台输出么?

我们要知道在java中默认的输出流就是向控制台输出的,如果我们要向其他地方输出信息,那么我们要指定输出的目标文件

我们可以找到在System类中有一个public static final PrintStream out字段

在System类中有一个方法setOut(PrintStream out)----重新分配“标准”输出流。我们可以知道它默认是向控制台输出的,如果我们要指定输出的目标文件,那么我们要传入一个PrintStream对象给它

实例如下:

public class Demo2 {
public static void main(String[] args) throws IOException {
File file = new File("D:\\新建文件夹\\a.txt");
PrintStream printStream = new PrintStream(file);
System.setOut(printStream);
System.out.println("嘿嘿,你找到我了吗?");
}
}

大家可能发现,这个有什么用,我用sysout输出不就是想在控制台看的么,不在控制台输出这不是很麻烦

其实我们一般把这个用来收集异常的日志信息,例如:

public class Demo2 {
public static void main(String[] args) throws IOException {
//一般我们把收集异常的文件名以当前的时间命名,后缀名以log结尾
File logfile = new File("D:\\新建文件夹\\2018年3月10日.log");
//使用这个构造方法,是因为日志信息不可能只有一条,为了防止数据丢失我们要用追加
PrintStream printStream = new PrintStream(new FileOutputStream(logfile,true));
try {
int c = 4/0;
System.out.println(c);
} catch (Exception e) {
//原来我们一般是写e.printStackTrace(),这样会把错误信息默认打印在控制台,
//其实这个方法还有一个重载的方法public void printStackTrace(PrintStream s)接受一个PrintStream对象
//用这个我们就可以把错误信息打印到指定的目标文件中了
e.printStackTrace(printStream);
}
}
}

73. PrintStream(打印流)的更多相关文章

  1. PrintStream打印流

    package file; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; impo ...

  2. PrintStream:打印流

    package com.itheima.demo05.PrintStream; import java.io.FileNotFoundException; import java.io.PrintSt ...

  3. 打印流(printStream)

    import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.Pri ...

  4. Properties-转换流-打印流-序列化和反序列化-Commons-IO工具类

    一.Properties 类(java.util)     概述:Properties 是一个双列集合;Properties 属于map的特殊的孙子类;Properties 类没有泛型,propert ...

  5. Java 之 打印流

    打印流 1.概述 平常在控制台打印输出,是调用 print 方法和 println 方法完成的,这两个方法都来自于 java.io.PrintStream 类,该类能够方便地打印各种数据类型的值,是一 ...

  6. JAVA笔记12__字节、字符缓冲流/打印流/对象流/

    /** * !!:以后写流的时候一定要加入缓冲!! * 对文件或其它目标频繁的读写操作,效率低,性能差. * 缓冲流:好处是能更高效地读写信息,原理是将数据先缓冲起来,然后一起写入或读取出来. * * ...

  7. java 打印流(PrintStream)

    打印流(PrintStream):打印流可以打印任意类型的数据,而且打印流在打印数据之前会将数据转为字符串在进行打印 PrintStream可以接受文件和其他字节输出流,所以打印流是对普通字节输出流的 ...

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

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

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

    这里的记录日志是利用打印流来实现的. 文本信息中的内容为String类型.而像文件中写入数据,我们经常用到的还有文件输出流对象FileOutputStream. File file = new Fil ...

随机推荐

  1. Service系统服务(四):搭建单区域DNS服务器、特殊DNS解析、配置DNS子域授权、搭建并测试缓存DNS

    一.搭建单区域DNS服务器 目标: 本例要求要求为DNS区域tedu.cn搭建一台DNS服务器,以便用户能通过域名的方式访问网站.测试阶段主要提供以下正向记录: svr7.tedu.cn ---> ...

  2. ubuntu下安装apidoc

    1.到http://nodejs.cn/download/下载nodejs 可以复制链接 使用wget下载更加快速 选择对应的操作系统位数 下载到/usr/local/src 此处强烈不建议编译安装 ...

  3. tidb集群

    tidb ansible部署 https://zhuanlan.zhihu.com/p/27308307?refer=newsql 网址:http://www.cnblogs.com/mowei/p/ ...

  4. idea 配置idk

    [Toc] #一.idea配置全局jdk ##1.1 File-->Project Structure ##1.2 选择SDKs ##1.3 选择jdk路径即可,可以添加多个jdk #二.配置项 ...

  5. 97、PageRank算法学习

    最近由于.......你懂得,需要一些搜索方面的知识,于是乎我重新复习了一下上半年读的那本书<数学之美>Dr吴军老师写的. 感觉读完这种书还是写一下比较好,因为将来说不定就会忘记了. 接下 ...

  6. 在windows命令行下安装和使用babel(es6to5)

    在自己的目录下新建一个babel-test/目录 进入这个目录 1. 安装babel命令和转换库:      npm install babel-cli      npm install babel- ...

  7. 用 Flask 来写个轻博客 (16) — MV(C)_Flask Blueprint 蓝图

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 Blueprint 蓝图 定义一个蓝图 注册一个蓝图 创建蓝 ...

  8. 编译Android系统源码和内核源码

    [日期:2016-01-11] 来源:Linux社区  作者:jiangwei [字体:大 中 小]     把我之前编译Android系统源码和内核源码的过程记录一下,因为这个过程真的是受益匪浅,看 ...

  9. shell 过滤器(管道)

    将几个命令通过管道符组合在一起就是一个管道,通常,通过这种方式使用的命令就被称为过滤器. 过滤器会获得输入,通过某种方式修改其内容,然后将其输出. 常用的被用作过滤器使用的命令为: 1.awk---用 ...

  10. 极致CMS建站系统后台GETSHELL

    起因 正在学习代码审计 看到有人提交了一个注入https://www.cnvd.org.cn/flaw/show/CNVD-2019-42775 想试试看还有没有别的漏洞 受影响版本 v1.6.3 - ...