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. Mysql中存储过程和函数的写法

    MySQL中,创建存储过程的基本形式如下: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine ...

  2. List Comprehension ()(一)

    >>> L = [1,2,3,4,5] >>> L = [x+10 for x in L] >>> L [11, 12, 13, 14, 15] ...

  3. java基础学习笔记一

    一.JAVA访问控制修饰符 用于控制类中成员的可见性 1.public(公有):在任何地方可以访问 2.protected(受保护的):子夫类(即使字父类不在同一包)和本包中可以访问 3.defaul ...

  4. Springboot解决使用@Scheduled创建任务时无法在同一时间执行多个任务的BUG

    1.在启动类使用 @SpringBootApplication @EnableJpaRepositories(repositoryFactoryBeanClass = MyRepositoryFact ...

  5. CSP2019赛前小复习:

    虽然觉得复习也没有什么用,还不吃好睡好,保持好心情. SA: 坑就那几个. \(s[0]=s[n+1]=-1\). 和\(rank\)交换的\(tp\)数组的\(tp[n+1]=0\). 一般加上这两 ...

  6. CF 1045 H. Self-exploration 解题报告

    CF 1045 H. Self-exploration 考虑到串的结构一定是 1...0....1....0.....1... 这样的,而\(01\)与\(10\)在转折点交替出现 首先串长一定是\( ...

  7. 搞懂分布式技术14:Spring Boot使用注解集成Redis缓存

    本文内容参考网络,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutor ...

  8. Spring核心——Bean的依赖注入

    依赖注入在设计模式与IoC这篇文章中,介绍了Spring基础的三大支柱的两项内容——IoC.Bean.本篇将继续围绕着Bean的创建时的注入方式来介绍Spring的核心思想与设计模式. 天底下所有面向 ...

  9. 【Spring Boot】Spring Boot项目设置多个配置文件,并在生产环境中的Tomcat设置对应的配置文件

    1.修改Spring Boot项目配置文件 除了主配置文件,另外创建2个配置文件,注意命名要用application-*.properties 主配置文件中写入,使用dev作为开发配置 spring. ...

  10. PHP基础知识总结(五) php面试题

    1.Ajax跨域 json:数据交换格式,{"name":"wangtianle"} jsonp:非官方跨域数据交换协议,可以通过动态添加<script/ ...