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