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 ...
随机推荐
- Service系统服务(四):搭建单区域DNS服务器、特殊DNS解析、配置DNS子域授权、搭建并测试缓存DNS
一.搭建单区域DNS服务器 目标: 本例要求要求为DNS区域tedu.cn搭建一台DNS服务器,以便用户能通过域名的方式访问网站.测试阶段主要提供以下正向记录: svr7.tedu.cn ---> ...
- ubuntu下安装apidoc
1.到http://nodejs.cn/download/下载nodejs 可以复制链接 使用wget下载更加快速 选择对应的操作系统位数 下载到/usr/local/src 此处强烈不建议编译安装 ...
- tidb集群
tidb ansible部署 https://zhuanlan.zhihu.com/p/27308307?refer=newsql 网址:http://www.cnblogs.com/mowei/p/ ...
- idea 配置idk
[Toc] #一.idea配置全局jdk ##1.1 File-->Project Structure ##1.2 选择SDKs ##1.3 选择jdk路径即可,可以添加多个jdk #二.配置项 ...
- 97、PageRank算法学习
最近由于.......你懂得,需要一些搜索方面的知识,于是乎我重新复习了一下上半年读的那本书<数学之美>Dr吴军老师写的. 感觉读完这种书还是写一下比较好,因为将来说不定就会忘记了. 接下 ...
- 在windows命令行下安装和使用babel(es6to5)
在自己的目录下新建一个babel-test/目录 进入这个目录 1. 安装babel命令和转换库: npm install babel-cli npm install babel- ...
- 用 Flask 来写个轻博客 (16) — MV(C)_Flask Blueprint 蓝图
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 Blueprint 蓝图 定义一个蓝图 注册一个蓝图 创建蓝 ...
- 编译Android系统源码和内核源码
[日期:2016-01-11] 来源:Linux社区 作者:jiangwei [字体:大 中 小] 把我之前编译Android系统源码和内核源码的过程记录一下,因为这个过程真的是受益匪浅,看 ...
- shell 过滤器(管道)
将几个命令通过管道符组合在一起就是一个管道,通常,通过这种方式使用的命令就被称为过滤器. 过滤器会获得输入,通过某种方式修改其内容,然后将其输出. 常用的被用作过滤器使用的命令为: 1.awk---用 ...
- 极致CMS建站系统后台GETSHELL
起因 正在学习代码审计 看到有人提交了一个注入https://www.cnvd.org.cn/flaw/show/CNVD-2019-42775 想试试看还有没有别的漏洞 受影响版本 v1.6.3 - ...