Java 流(Stream),读(Reader)和写(Writer)

一个流可以理解为一个数据(字符,字节)的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。同时,一个流也可以作为另外一个流对象的读取和写入目标。
Reader类是用于对输入字符流进行读取的抽象类,常用子类有BufferedReader和InputStreamReader;Writer类的作用是将字符流写入到对应的输出流中,常用子类有BufferedWriter和InputStreamWriter。

常见字节输入流有BufferedInputStream()、DataInputStream()、FileInputStream()和InputStream(),InputStream()是所有输入流类的父类;输入流有BufferedOutputStream()、DataOutputStream()、FileOutputStream()和OutputStream(),OutputStream()是所有输入流类的父类。如图:

InputStream()

  • BufferedInputStream() 缓冲其他字节输入流
  • DataInputStream() 从底层输入流中读取Java基本数据类型
  • FileInputStream() 读取具体文件系统的字节输入流

OutputStream()

  • BufferedOutputStream() 缓冲其他的字节输出流
  • DataOutputStream() 将Java基本数据类型写入底层输出流
  • FileOutputStream() 写入具体文件系统的字节输出流

Reader

  • BufferedReader() 缓冲底层的字符输入流
  • InputStreamReader() 字节流到字符流的桥梁,可以指定编码方式

Writer

  • BufferedWriter() 缓冲底层的字符输出流
  • OutputStreamWriter() 字符流到字节流的桥梁,可以指定编码方式

示例1

import java.io.*;
import java.util.Scanner;
public class FileStreamIO {
	public static void main(String[] args) throws IOException {
		//创建文件对象
		File f = new File("IOTest.txt");
		//创建输出到指定文件的文件输出流(字节流)对象
		FileOutputStream os = new FileOutputStream(f);
		//创建将字符串写入到输出流(字节流)的Writer对象,用.write()方法实现
		OutputStreamWriter writer = new OutputStreamWriter(os,"utf-8");
		System.out.println("输入文本:");
		Scanner scan = new Scanner(System.in);
		String string = null;
		//获取输入的字符串,知道输入end结束
			string = scan.next();
			try {
				if(!(string.equals("end"))){
					//将获得字符串用.write()方法写到已有的字符后面
					writer.write(string);
//					System.out.println(string);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
		}while(!(string.equals("end")));
		writer.close();
		scan.close();
		os.close();
		//创建指定文件的输入流对象
		InputStream is = new FileInputStream(f);
		//创建将输入字节流转换成字符流的对象,并用构造方法指定编码方式,防止乱码
		InputStreamReader reader = new InputStreamReader(is,"utf-8");
		//创建字符串缓冲器,用于存储reader对象得到的字符流
		StringBuffer buffer = new StringBuffer();
		while(reader.ready()) {
			//将read()方法读取到的字符流缓存到字符缓冲器中
				buffer.append((char)reader.read());		
		//输出字符缓冲器中的字符集合,并将它们返回成一个字符串输出
		System.out.println(buffer.toString());
		reader.close();
		is.close();
}

示例2

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BRReadLine {
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		//使用System.in创建BufferedReader对象
		BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("输入连续文本");
		System.out.println("输入end停止");
		String str;
		do {    //.readLine()读取缓存器中的字符串,以行形式读取
			str = bufferedreader.readLine();
			System.out.println(str);
			//java只有object类(引用类型)才有.equals()方法,基本数据类型用==