java学习笔记之IO编程—打印流和BufferedReader
1.打印流(PrintWriter)
想要通过程序实现内容输出,其核心一定是要依靠OutputStream类,但是OutputStream类有一个最大缺点,就是这个类中的输出操作功能有限,所有的数据一定要转换为字节数组后才可以输出,当我们想要输出的数据可能是long,double,Date时就变得很麻烦,在不用java提供的PrintWriter类的情况下,我们可以自己定义功能来解决此类问题,代码如下:
import java.io.*;
public class PrintStreamDemo {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
File file = new File("D:"+File.separator+"www.txt");
PrintUtil pu = new PrintUtil(new FileOutputStream(file));
pu.println("姓名:张伟");
pu.print("年龄:");
pu.println(32);
pu.close();
}
}
class PrintUtil implements AutoCloseable{//实现一些常用数据的输出
private OutputStream output;//不管你现在如何进行输出操作,核心使用的就是OutputStream
public PrintUtil(OutputStream output) {//由外部来决定输出的位置
super();
this.output = output;
}
public void print(long num) {
this.print(String.valueOf(num));
}
public void println(long num) {
this.println(String.valueOf(num));
}
public void print(String str) {//输出字符串
try {
this.output.write(str.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void println(String str) {
this.print(str+"\r\n");
}
@Override
public void close() throws Exception {
// TODO Auto-generated method stub
this.output.close();
}
}
OutputStream是唯一可以实现输出的操作标准类,所以在整个操作中已其为核心根本,但是这个类输出的操作功能有限,所以不方便进行输出各个数据的类型,所以就为它做出一层包装类,采用的思想是“装饰设计模式”,整个操作的本质就是通过外层包装类将各种数据(long,double,Date等)转换成字符串,再通过OutputStream类进行输出。
当然,以上的操作不需要我们自己定义,在java.io包里面就提供有打印流:PrintStream(主要操作字节流) PrintWriter(主要操作字符流)
PrintStream类的定义:
public class PrintStream extends FilterOutputStream implements Appendable, Closeable
构造方法:
public PrintStream(OutputStream out)
PrintWriter类的定义:
public class PrintWriter extends Writer
构造方法:
public PrintWriter(OutputStream out)
public PrintWriter(Writer out)
代码实例:
package IODemo;
import java.io.*;
public class PrintWriterDemo {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
File file = new File("D:"+File.separator+"www.txt");
PrintWriter pw = new PrintWriter(new FileOutputStream(file));
String name = "小布";
int age = 33;
double salary = 15000;
pw.printf("name:%s age:%d salary:%.2f", name,age,salary);
pw.close();
}
}
比起直接使用OutputStream类,那么使用PrintWriter PrintStream类的处理操作会更加简单。只要是进行内容输出的时候全部用打印流。
2.BufferedReader类
提供的是一个缓冲字符输入流的概念,也就是说利用BufferedRead类可以很好的解决输入流数据的读取问题,当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取,这个类在最初的时候提供的最完善的数据输入的处理。
从标准输入流System.in中直接读取使用者输入时,使用者每输入一个字符,System.in就读取一个字符。为了能一次读取一行使用者的输入,使用了BufferedReader来对使用者输入的字符进行缓冲。readLine()方法会在读取到使用者的换行字符时,再一次将整行字符串传入。
System.in是一个字节输入流,为了转换为字符输入流,可使用InputStreamReader将其转换为字符流,然后再使用BufferedReader为其增加缓冲功能。例如:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedReader类的定义:
public class BufferedReader extends Reader
构造方法:
public BufferedReader(Reader in)
代码实例:
import java.io.*;
public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输您的年龄:");
String msg = input.readLine();//接收输入信息
if(msg.matches("\\d+")) {
int age = Integer.parseInt(msg);
System.out.println("年龄为:"+msg);
}else {
System.out.println("不对");
}
}
}
当程序中需要用到输入数据的情况时,所有数据的类型都是通过String进行描述,这样就方便接送者进行各种处理,BufferedReader可以被Scanner替代
注意:输出数据一定用打印流,输入数据用Scanner或BufferedReader
java学习笔记之IO编程—打印流和BufferedReader的更多相关文章
- java学习笔记之IO编程—内存流、管道流、随机流
1.内存操作流 之前学习的IO操作输入和输出都是从文件中来的,当然,也可以将输入和输出的位置设置在内存上,这就需要用到内存操作流,java提供两类内存操作流 字节内存操作流:ByteArrayOutp ...
- java学习笔记之IO编程—字节流和字符流
1. 流的基本概念 在java.io包里面File类是唯一一个与文件本身有关的程序处理类,但是File只能够操作文件本身而不能操作文件的内容,或者说在实际的开发之中IO操作的核心意义在于:输入与输出操 ...
- java学习笔记之IO编程—对象序列化
对象序列化就是将内存中保存的对象以二进制数据流的形式进行处理,可以实现对象的保存或网络传输. 并不是所有的对象都可以被序列化,如果要序列化的对象,那么对象所在的类一定要实现java.io.Serial ...
- java学习笔记之IO编程—目录和文件的拷贝
进行文件或目录的拷贝时,要先判断处理对象是文件还是目录,如果是文件则直接拷贝,如果是目录还需要拷贝它的子目录及其文件,这就需要递归处理了 import java.io.*; class FileUti ...
- java学习笔记之IO编程—File文件操作类
1. File类说明 在Java语言里面提供有对于文件操作系统操作的支持,而这个支持就在java.io.File类中进行了定义,也就是说在整个java.io包里面,File类是唯一一个与文件本身操作( ...
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- java学习笔记14--多线程编程基础1
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...
- Java IO学习笔记(四)打印流
1.只有输出流才有打印流:PrintWriter和PrintStream分别针对字符和字节,提供了重载的print,Println方法用于多种数据类型的输出.PrintWriter和PrintStre ...
- Java学习笔记-10.io流
1.输入流,只能从中读取数据,而不能向其写出数据.输出流,只能想起写入字节数据,而不能从中读取. 2.InputStream的类型有: ByteArrayInputStream 包含一个内存缓冲区,字 ...
随机推荐
- Jmeter 连接Redis获取数据集
公司开展了新的业务活动,需要配合其他部门做压测,由于脚本中的手机号和用户的uid需要参数化而且每次均不能重复,最初的考虑使用csv的方式来获取数据,比较头疼的问题是集群节点需要维护测试数据,所以我将所 ...
- css中的盒子模型是什么?
什么是CSS 盒子模型(Box Model) 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用. CSS盒模型本质上是一个盒子,封装周 ...
- 最新版的EF Core对UWP支持的怎么样
为啥写这篇帖子呢?其实是因为翻微软的文档中心偶然翻到的,于是就出于好奇就试试了,看看用着怎么样. 以前没注意图片,所以我今天发现的时候,显示EF Core3.1支持standard2.0,于是就想试试 ...
- redis的基础知识
select切换数据库 remoteSelf:0>select 0 "OK" dbsize查看当前数据库的key数量 remoteSelf:0>dbsize " ...
- UNIX环境高级编程-第三章习题
1,当读写磁盘文件时,read,write等函数确实是不带缓冲机制的吗?请说明原因. 答:所有磁盘I/O都要经过内核的块缓存区(即内核的缓冲区高速缓存).唯一例外的是对原始磁盘设备的I/O,但是我们不 ...
- SpringBoot整合NoSql--(四)Session共享
简介: 正常情况下,HttpSession是通过Servlet 容器创建并进行管理的,创建成功之后都是保存在内存中.如果开发者需要对项目进行横向扩展搭建集群,那么可以利用一些硬件或者软件工具来做负载均 ...
- js对象模型1
- H5Demo_password_generator
原项目资源地址: https://www.html5tricks.com/js-passwd-generator.html codepen地址: https://codepen.io/deuscx/p ...
- Android实战项目——家庭记账本(七)
今天主要实现了登录注册功能的客户端和服务端,但由于短信接口调用出现问题,导致注册功能还不完整. 截止到今天,APP的功能已经基本完成,后续还会陆陆续续的完善各功能模块与服务端的交互,因为需要和云端关联 ...
- 解决在jsp页面中使用jstl无法遍历request域中list集合的问题
解决在jsp页面中使用jstl无法遍历request域中list集合的问题 1. 前言 最近在写一个很简单的Javaweb项目,里面需要将request域中的list集合加载到jsp页面,我使用e ...