java I/O———打印流

标签: java

打印流解决的就是OutputStream的设计缺陷,属于OutputStream功能的加强版。如果操作的不是二进制数据,只是想通过程序向终端目标输出信息的话,OutputStream不是很方便,其缺点有两个:

  1. 所有的数据必须转换为字节数组。
  2. 如果要输出的是int、double等类型就不方便了

打印流概念

打印流设计的主要目的是为了解决OutputStream的设计问题,其本质不会脱离OutputStream。

范例:自己设计一个简单打印流

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

class PrintUtil {
    private OutputStream out ;
    // 由外部传入要输出的目标终端
        public PrintUtil(OutputStream out) {
            this.out = out ;
    }
    // 核心功能就一个
    public void print(String str) {
        try {
            this.out.write(str.getBytes());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public void println(String str) {
        this.print(str+"\n");
    }
    public void print(int data) {
        this.print(String.valueOf(data));
    }
    public void println(int data) {
        this.println(String.valueOf(data));
    }
    public void print(double data) {
        this.print(String.valueOf(data));
    }
    public void println(double data) {
        this.println(String.valueOf(data));
    }
    }

public class TestPrint {
    public static void main(String[] args) throws Exception {
        PrintUtil printUtil = new PrintUtil(new FileOutputStream(new
        File("/Users/yuisama/Desktop/test.txt"))) ;
        printUtil.print("姓名:") ;
        printUtil.println("fiying fish") ;
        printUtil.print("年龄:") ;
        printUtil.println(21) ;
        printUtil.print("工资: ") ;
        printUtil.println(0.0001);
    }
}

经过简单处理之后,让OutputStream的功能变的更加强大了,其实本质就只是对OutputStream的功能做了一个封装而已。java提供有专门的打印流处理类:PrintStream、PrintWriter

2.使用系统提供的打印流

打印流分为字节打印流:PrintStream、字符打印流:PrintWriter,以后使用PrintWriter几率较高。首先来观察这两个类的继承结构与构造方法:

在这里插入图片描述

在这里插入图片描述

此时看上图继承关系我们会发现,有点像之前讲过的代理设计模式,但是代理设计模式有如下特点:

  1. 代理是以接口为使用原则的设计模式。
  2. 最终用户可以调用的方法一定是接口定义的方法。

打印流的设计属于装饰设计模式:核心依然是某个类的功能,但是为了得到更好的操作效果,让其支持的功能更多一些

范例:使用打印流

public class TestPrint {
    public static void main(String[] args) throws Exception {
        PrintWriter printUtil = new PrintWriter(new FileOutputStream(new File("/Users/yuisama/Desktop/test.txt"))) ;
        printUtil.print("姓名:") ;
        printUtil.println("flying fish") ;
        printUtil.print("年龄:") ;
        printUtil.println(21) ;
        printUtil.print("工资: ") ;
        printUtil.println(0.00001) ;
        printUtil.close();
    }
}

以后的开发之中一定会用到打印流。

3.格式化输出

C语言有一个printf()函数,这个函数在输出的时候可以使用一些占位符,例如:字符串(%s)、数字(%d)、小数(%m.nf)、字符(%c)等。从JDK1.5开始,PrintStream类中也追加了此种操作。

格式化输出:

public PrintStream printf(String format, Object ... args)

范例:观察格式化输出

public class TestPrint {
    public static void main(String[] args) throws Exception {
        String name = "fiyingfish" ;
        int age = 21 ;
        double salary = 1.10000001 ;
        PrintWriter printUtil = new PrintWriter(new FileOutputStream(new
File("/Users/yuisama/Desktop/test.txt"))) ;
        printUtil.printf("姓名:%s,年龄:%d,工资:%1.2f", name,age,salary) ;
        printUtil.close();
    }
}

同时在String类中也追加有一个格式化字符串方法。

格式化字符串:

public static String format(String format, Object... args)

范例:格式化字符串

public class TestPrint {
    public static void main(String[] args) throws Exception {
        String name = "flyingfish" ;
        int age = 21 ;
        double salary = 1.1000001 ;
        String str = String.format("姓名:%s,年龄:%d,工资:%1.2f",name,age,salary,
name,age,salary) ;
            System.out.println(str);
    }
}

Ajax都是打印流支撑的

版权声明:本文为qq_43223415原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43223415/article/details/87177861

智能推荐

更改springboot启动拼成的字母

1.更改springboot启动拼成的字母 其实很好改,只需要在resources下新建一个txt文件就可以,命名为banner.txt,那这种字符该怎么拼出来呢,下面推荐一个网址,有这种工具 传送门 2.集成...

Node.js安装配置

好久都没更新博客了,今天心血来潮,决定是时候更新一篇了,首先我们来认识一下node.js。 什么是node.js? 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的...

RocketMQ之双Master集群搭建笔记记录

一:RocketMQ双master集群部署 服务器环境(我采用的虚拟机,centos6 .5【特别注意:安装的虚拟机centos系统一定得是64位的,32位的会启动不起来。即便起来了也会有很多问题,深坑勿踩】)  ip       用户名    密码        角色     模式 192.168.197.101   root        nameServer1,brokerServer1  ...

蓝桥杯试题集-基础练习题-数列特征(Java)

//做题笔记,仅自己看得懂 题目: 正确姿势:...

多线程爬取4k超高清美图壁纸

多线程爬取4k美图壁纸 前言:看完此篇文章你可以更加深入的了解多线程的使用,并且最重要的你能够下载你自己想要的超高清4k壁纸 爬取结果: 1. 分析网站 要爬取的url :http://pic.netbian.com/ a) 判断网页是动态加载还是静态加载页面。右击查看网页源代码,按Ctrl + f在源代码中搜索网站的详情页地址,从而判断整个网页是静态加载的 b) 明确爬取的目标。我们要爬取的目标...

猜你喜欢

elementUI-添加自定义图标

elementui的小图标有限,跟UI给的不一样,这个时候咋办呢?百度走起。。。。参考了两篇博主分享的 自定义elementui中的图标 和 建立图标库,这里主要用到第一种 实际中: elementUI导航栏 具体代码: 汉字转换Unicode编码: 直接打开控制台: 汉字.chatCodeAt().toString(16); 然后回车; 至于三角形的图标,我直接把箭头的 unicode 值改成了...

[Linux]——文件缓冲区

文件缓冲区 提到文件缓冲区这个概念我们好像并不陌生,但是我们对于这个概念好像又是模糊的存在脑海中,之间我们在介绍c语言文件操作已经简单的提过这个概念,今天我们不妨深入理解什么是文件缓冲区。 为什么需要文件缓冲区 当我们在程序中写下一条printf语句时,我们希望将这条语句的内容打印到屏幕上。但是如果你将语句放在循环中,难道你执行一次循环那么操作系统就要打印一次这条数据么?答案当然不是 我们对于程序...

基于FPGA的IIC协议详解——EEPROM控制器(1)

IIC协议举例 常用IIC协议使用地方 常见IIC协议的注意点 24LC64芯片读写命令的时序图 eeprom控制器的系统框图 时序图设计 代码设计 EEPROM控制器测试模块的代码 结束语 常用IIC协议使用地方 熟悉一个协议一定要知道这个协议应该用到什么地方,IIC协议作为飞利浦公司定义的一个慢速传输协议,常用于: 1、芯片寄存器的配置; 2、eeprom的读写; 本次实验我们将使用eepro...

ssm 工程简易搭建(idea 工具下)

现在都流行springboot了,大部分都给你配合了了,可以快速开发。但是今天我们回顾一下ssm的搭建,其实也挺简单的,比刚入门那会觉得简单多了。 这个先讲几点: 1.开始搭建前,idea 自己要配置maven 和tomcat和jdk ,这里就不讲了。 2.为了简化配置,我们按照“约定优于配置”的原则(这种原则在sprigboot项目里面特别明显),启动项目时,项目有个文件...

oracle简单视图read only、check option和默认权限的异同(相对于DML语句)

视图分为俩类: 简单视图:   视图所代表的sql中如果没有group by语句,   没有组函数,查询的只有一张表,那么这样的视图就是简单视图. 复杂视图   视图所代表的sql中如果有group by语句,   或者有组函数,或者查询的是多张表,那么这样的视图就是复杂视图. s_emp表格属性 默认权限 1.可以插入不满足where条件的数据,原表也会更...