73. PrintStream(打印流)
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(打印流)的更多相关文章
- PrintStream打印流
package file; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; impo ...
- PrintStream:打印流
package com.itheima.demo05.PrintStream; import java.io.FileNotFoundException; import java.io.PrintSt ...
- 打印流(printStream)
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.Pri ...
- Properties-转换流-打印流-序列化和反序列化-Commons-IO工具类
一.Properties 类(java.util) 概述:Properties 是一个双列集合;Properties 属于map的特殊的孙子类;Properties 类没有泛型,propert ...
- Java 之 打印流
打印流 1.概述 平常在控制台打印输出,是调用 print 方法和 println 方法完成的,这两个方法都来自于 java.io.PrintStream 类,该类能够方便地打印各种数据类型的值,是一 ...
- JAVA笔记12__字节、字符缓冲流/打印流/对象流/
/** * !!:以后写流的时候一定要加入缓冲!! * 对文件或其它目标频繁的读写操作,效率低,性能差. * 缓冲流:好处是能更高效地读写信息,原理是将数据先缓冲起来,然后一起写入或读取出来. * * ...
- java 打印流(PrintStream)
打印流(PrintStream):打印流可以打印任意类型的数据,而且打印流在打印数据之前会将数据转为字符串在进行打印 PrintStream可以接受文件和其他字节输出流,所以打印流是对普通字节输出流的 ...
- IO流(五)__文件的递归、Properties、打印流PrintStream与PrintWriter、序列流SequenceInputStream
一.文件的遍历 1.需求:对指定目录进行所有的内容的列出(包含子目录的内容)-文件的深度遍历 思想:递归的思想,在递归的时候要记住递归的层次. public class FileTest { publ ...
- (JAVA)从零开始之--打印流PrintStream记录日志文件
这里的记录日志是利用打印流来实现的. 文本信息中的内容为String类型.而像文件中写入数据,我们经常用到的还有文件输出流对象FileOutputStream. File file = new Fil ...
随机推荐
- sql 摘抄
练习题和参考解 (1)查询“001”课程比“002”课程成绩低的所有学生的学号.001学科成绩.002学科成绩 1 SELECT 2 s1.StudentNo, 3 s ...
- 第12篇Kubernetes 监控
一.Weave Scope: Weave Scope 容器地图 创建 Kubernetes 集群并部署容器化应用只是第一步.一旦集群运行起来,我们需要确保一起正常,所有必要组件就位并各司其 ...
- config.properties
# 数据库配置db.host=10.100.2.50db.port=3306db.database=paycoredb.username=rootdb.password=mysql@123db.ini ...
- 在scite编辑器中使用astyle格式化c代码
用 vc6 很喜欢 alt+F8 的功能. 能够格式化代码. scite 没有这个功能. 今天看它的配置文件发现这么两行: command.name.0.*.cxx=Indent command.0. ...
- 使用node-static运行vue打包文件dist
vue打包后的文件dist,如果想上线之前查看效果,方法如下: npm install -g node-static 进入到dist文件夹,运行static命令 打开上面地址
- AcWing 243. 一个简单的整数问题2 (树状数组)打卡
题目:https://www.acwing.com/problem/content/244/ 题意:区间加,区间查询 思路:我们把原先那个差分数组分解一下 ∑i=1x∑j=1ib[j]=∑i=1x(x ...
- Selenium之Android使用学习
20140507 Selenium一般用在web自动化上,为什么Android上也能用呢? 如图,手机端和DB联动:手机端的客户端给server发数据流,进行增删改查操作,这种写数据用update更新 ...
- 用FastDFS一步步搭建图片服务器(单机版)
一.FastDFS介绍 FastDFS开源地址:https://github.com/happyfish100 参考:分布式文件系统FastDFS设计原理 参考:FastDFS分布式文件系统 1.简介 ...
- 如何在原生Android项目里嵌入Cordova
背景: 这段时间在维护一个Cordova混合项目,以前稍微接触过Cordova,也写过简单的纯纯的Cordova的Demo,但是没有尝试过混合原生的Cordova. 在接到项目后比较了一下项目架构和C ...
- .NET Core开源组件:后台任务利器之Hangfire 转载 https://www.cnblogs.com/chenug/p/6655636.html
.NET Core开源组件:后台任务利器之Hangfire 一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的D ...