IO流的操作规律
流的操作规律
之所以要弄清楚这个规律,是因为流对象太多,开发时不知道用哪个对象合适.
想知道开发时用到哪些对象,只要通过四个明确即可
1.明确源和目的
源:InputStream Reader
目的:OutputStream Writer
2.明确数据是否是纯文本数据.
源: 是纯文本 Reader
否 InputStream
目的: 是纯文本 Writer
否 OutputStream
到这里,就可以明确需求中具体要使用哪个 体系了
3.明确具体的设备
源设备:
硬盘: File
键盘: System.in
内存:数组
网络:Socket流
目的设备:
硬盘: File
控制台: System.out
内存:数组
网络:Socket流
4.是否需要其他额外功能
a.是否需要高效(缓冲区)
是,就加上buffer
b.转换流 InputStreamReader OutputStreamWriter
需求1:复制一个文本文件
a.明确源和目的
源:InputStream Reader
目的: OutputStream Writer
b.是否是纯文本
是,源:Reader
目的:Writer
c.明确具体设备
源:硬盘 File
目的:硬盘 File
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
d.需要额外功能
需要,高效,
BufferedReader buff =
new BufferedReader(fr);
BufferedWriter bufw = new BufferedWriter(fw);
需求2:读取键盘录入信息,并写入到文本文件中
a.明确源和目的
源:InputStream Reader
目的: OutputStream Writer
b.是否是纯文本
是,源:Reader
目的:Writer
c.明确具体设备
源:键盘 System.in
目的:硬盘 File
InputStream in = System.in;//字节流,使用InputStreamReader
FileWriter fw = new FileWriter("b.txt");
这样做可以完成,但是麻烦,将读取的字节数据转成字符串,再由字符流操作
d.需要额外功能
转换.将字节流围成字符流,因为明确的源是Reader,这样操作方便数据时,便捷.所以要将已有的字节流转成字符流.使用字节-->字符 使用InputStreamReader
InputStreamReader isr =
new InputStreamReader(System.in);
FileWriter fw = new FileWriter("b.txt");
需要,高效,
BufferedReader buff =
new BufferedReader(isr);
需求3:将一个文件文件内容显示在控制台上
a.明确源和目的
源:InputStream Reader
目的: OutputStream Writer
b.是否是纯文本
是,
源:Reader
目的:Writer
c.明确具体设备
源:硬盘:File
目的:控制台:System.out
FileReader fr = new FileReader("a.txt");
OutputStream out = System.out;//这样输出内容很麻烦,使用转换流
d.需要额外功能吗?
需要:
转换流
FileReader fr = new new FileReader("a.txt");
OutputStreamWriter osw = new OutputStreamWriter(System.out);
高效,buffer
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
需求4:读取键盘录入数据,显示在控制台上
a.明确源和目的
源:InputStream Reader
目的: OutputStream Writer
b.是否是纯文本
是,
源:Reader
目的:Writer
c.明确具体设备
源:键盘:System.in
目的:控制台:System.out
InputStream in = System.in;
OutputStream out = System.out;
d.明确额外功能?
需要转换,因为都是字节流,但是操作的却是文本数据
所以使用字符流操作起来更为便捷
InputStreamReader isr =
new InputStreamReader(System.in);
OutputStreamWriter osw =
new OutputStreamWriter(System.out);
为了将其高效
BufferedReader bufr = new BufferedReader(isr);
BufferedWriter bufw = new BufferedWriter(osw);
什么时候使用转换流呢?
1.源或者目的对应的设备是字节流,但是操作的却是文本数据,可以使用转换作为桥梁,提高对文本操作的便捷.
之所以要弄清楚这个规律,是因为流对象太多,开发时不知道用哪个对象合适.
想知道开发时用到哪些对象,只要通过四个明确即可
1.明确源和目的
源:InputStream Reader
目的:OutputStream Writer
2.明确数据是否是纯文本数据.
源: 是纯文本 Reader
否 InputStream
目的: 是纯文本 Writer
否 OutputStream
到这里,就可以明确需求中具体要使用哪个 体系了
3.明确具体的设备
源设备:
硬盘: File
键盘: System.in
内存:数组
网络:Socket流
目的设备:
硬盘: File
控制台: System.out
内存:数组
网络:Socket流
4.是否需要其他额外功能
a.是否需要高效(缓冲区)
是,就加上buffer
b.转换流 InputStreamReader OutputStreamWriter
需求1:复制一个文本文件
a.明确源和目的
源:InputStream Reader
目的: OutputStream Writer
b.是否是纯文本
是,源:Reader
目的:Writer
c.明确具体设备
源:硬盘 File
目的:硬盘 File
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
d.需要额外功能
需要,高效,
BufferedReader buff =
new BufferedReader(fr);
BufferedWriter bufw = new BufferedWriter(fw);
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.FileReader;
- import java.io.FileWriter;
- import java.io.IOException;
- public class BufferedCopy {
- public static void main(String[] args)throws IOException {
- //创建BufferedReader一样,必须先有流。
- FileReader fr = new FileReader("tempfile\\buf.txt");
- BufferedReader bufr = new BufferedReader(fr);
- //创建一个字符写入流的缓冲区。应该先创建流。
- FileWriter fw = new FileWriter("tempfile\\buf2.txt");
- BufferedWriter bufw = new BufferedWriter(fw);
- String line = null;
- while((line=bufr.readLine())!=null){
- bufw.write(line);
- // 换行
- bufw.newLine();
- bufw.flush();
- }
- bufr.close();
- bufw.close();
- }
- }
需求2:读取键盘录入信息,并写入到文本文件中
a.明确源和目的
源:InputStream Reader
目的: OutputStream Writer
b.是否是纯文本
是,源:Reader
目的:Writer
c.明确具体设备
源:键盘 System.in
目的:硬盘 File
InputStream in = System.in;//字节流,使用InputStreamReader
FileWriter fw = new FileWriter("b.txt");
这样做可以完成,但是麻烦,将读取的字节数据转成字符串,再由字符流操作
d.需要额外功能
转换.将字节流围成字符流,因为明确的源是Reader,这样操作方便数据时,便捷.所以要将已有的字节流转成字符流.使用字节-->字符 使用InputStreamReader
InputStreamReader isr =
new InputStreamReader(System.in);
FileWriter fw = new FileWriter("b.txt");
需要,高效,
BufferedReader buff =
new BufferedReader(isr);
BufferedWriter bufw = new BufferedWriter(fw);
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.io.InputStreamReader;
- public class ReadKeyDemo {
- public static void main(String[] args) throws IOException {
- BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//记住:以后读取键盘都用这句,可以背下来。
- BufferedWriter bufw = new BufferedWriter(new FileWriter("d:/a.txt"));
- String line = null;
- while((line=bufr.readLine())!=null){
- //如果输入over,程序结束
- if("over".equals(line))
- {
- break;
- }
- bufw.write(line);
- // 换行
- bufw.newLine();
- bufw.flush();
- }
- bufr.close();
- bufw.close();
- }
- }
需求3:将一个文件文件内容显示在控制台上
a.明确源和目的
源:InputStream Reader
目的: OutputStream Writer
b.是否是纯文本
是,
源:Reader
目的:Writer
c.明确具体设备
源:硬盘:File
目的:控制台:System.out
FileReader fr = new FileReader("a.txt");
OutputStream out = System.out;//这样输出内容很麻烦,使用转换流
d.需要额外功能吗?
需要:
转换流
FileReader fr = new new FileReader("a.txt");
OutputStreamWriter osw = new OutputStreamWriter(System.out);
高效,buffer
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.FileReader;
- import java.io.IOException;
- import java.io.OutputStreamWriter;
- public class ReadKeyDemo {
- public static void main(String[] args) throws IOException {
- BufferedReader bufr = new BufferedReader(new FileReader("d:/a.txt"));
- BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
- String line = null;
- while((line=bufr.readLine())!=null){
- bufw.write(line);
- // 换行
- bufw.newLine();
- bufw.flush();
- }
- bufr.close();
- bufw.close();
- }
- }
需求4:读取键盘录入数据,显示在控制台上
a.明确源和目的
源:InputStream Reader
目的: OutputStream Writer
b.是否是纯文本
是,
源:Reader
目的:Writer
c.明确具体设备
源:键盘:System.in
目的:控制台:System.out
InputStream in = System.in;
OutputStream out = System.out;
d.明确额外功能?
需要转换,因为都是字节流,但是操作的却是文本数据
所以使用字符流操作起来更为便捷
InputStreamReader isr =
new InputStreamReader(System.in);
OutputStreamWriter osw =
new OutputStreamWriter(System.out);
为了将其高效
BufferedReader bufr = new BufferedReader(isr);
BufferedWriter bufw = new BufferedWriter(osw);
- /**
- 录入键盘输入字母并将小写变为大写
- */
- import java.io.*;
- class readin
- {
- public static void main(String[] args)throws IOException
- {
- InputStream in = System.in;//引入输入流
- InputStreamReader isr = new InputStreamReader(in);
- StringBuilder sb = new StringBuilder();//新建一个缓冲区
- while(true)
- {
- int ch = in.read();//读入键盘输入
- if(ch=='\r')
- continue;
- if(ch=='\n')
- {
- String s = sb.toString();//讲读入输入转换为字符型
- if("over".equals(s))//判断S是否为OVER
- break;
- else
- System.out.println(s.toUpperCase());//打印出字母大写
- sb.delete(0,sb.length());
- }
- else
- sb.append((char)ch);
- }
- }
- }
什么时候使用转换流呢?
1.源或者目的对应的设备是字节流,但是操作的却是文本数据,可以使用转换作为桥梁,提高对文本操作的便捷.
2.一旦操作文本涉及到具体的指定编码表时,必须使用转换流
转载:http://blog.csdn.net/chaoyu168/article/details/49663881