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+"
");
    }
    @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

原文地址:https://www.cnblogs.com/wulianjie/p/12258117.html