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()方法,基本数据类型用==