1 字节流
OutputStream ->FileOutputStream
2 字符流
Reader -> BufferedReader -> LineNumberReader
-> InputStreamReader -> FileReader
Writer -> BufferedWriter
-> OutputStreamWriter -> FileWriter
============================================================
由JDK的IO流继承结构我们看到
FileInputStream和FileOutputStream是直接继承自字节流基类的
而FileReader和FileWriter是继承自2个转换流,
为什么会这样呢?
很可能是因为FileReader和FileWriter都是对字符型文件的操作,
而计算机处理的是字节数据,
读取文件后要将字符对象转成字节对象,
在写入到文件时时要将字节对象转成字符对象
/*
[示例]:按行读写控制台中的字符
*/
import java.io.*;
class Demo
{
public static void main(String[] args) throws IOException
{
readAndWriteCmd();
}
public static void readAndWriteCmd() throws IOException
{
//1.获取键盘输入的字节流对象
InputStream in = System.in;
//2.将字节流对象转成字符流对象,使用转换流InputStreamReader
InputStreamReader isr = new InputStreamReader(in); //in字节流就变成isr字符流了
//3.为了提高效率,使用字符缓冲流BufferedReader
BufferedReader bufr = new BufferedReader(isr);
OutputStream output = System.out;
OutputStreamWriter osw = new OutputStreamWriter(output);
BufferedWriter bufw= new BufferedWriter(osw); //因为要用到换行newLine()
//4.然后就可以使用BufferedReader的readLine方法一次读取一行,读了再写到cmd里
String lineStr=null;
while(true)
{
lineStr = bufr.readLine(); //读取我们从键盘输入到控制台的内容
if(lineStr!=null)
{
if(lineStr.equals("over")) //输入over时结束
{
break;
}
else
{
bufw.write(lineStr); //写到控制台
bufw.newLine(); //输出换行符,在windows里也可直接输出"\r\n"
bufw.flush(); //清空缓冲区,否则下一次输出时会重复输出
}
}
else
{
break;
}
}
}
}