二、流操作规律 1、 源:键盘录入。 目的:控制台。 2、需求:想把键盘录入的数据存储到一个文件中。 源:键盘 目的:文件。 使用字节流通向字符流的转换流(桥梁):InputStreamReader 3、需求:想要将一个文件的数据打印在控制台上。 源:文件 目的:控制台 使用字符流通向字节流的转换流(桥梁):OutputStreamWriter 4、流操作的基本规律: 最痛苦的就是流对象有很多,不知道该用哪一个。 通过三个明确来完成: 4.1 明确源和目的。 源:输入流。InputStream Reader 目的:输出流。OutputStream Writer 4.2 操作的数据是否是纯文本。 是:字符流 否:字节流 4.3 当体系明确后,再明确要使用哪个具体的对象。通过设备来进行区分: 源设备:内存,硬盘,键盘 目的设备:内存,硬盘,控制台 5、规律体现 5.1 将一个文本文件中数据存储到另一个文件中。复制文件。 1)源:因为是源,所以使用读取流:InputStream和Reader 明确体系:是否操作文本:是,Reader 明确设备:明确要使用该体系中的哪个对象:硬盘上的一个文件。Reader体系中可以操作文件的对象是FileReader 是否需要提高效率:是,加入Reader体系中缓冲区 BufferedReader. FileReader fr = new FileReader("a.txt"); BufferedReader bufr = new BufferedReader(fr); 2)目的:输出流:OutputStream和Writer 明确体系:是否操作文本:是,Writer 明确设备:明确要使用该体系中的哪个对象:硬盘上的一个文件。Writer体系中可以操作文件的对象FileWriter。 是否需要提高效率:是,加入Writer体系中缓冲区 BufferedWriter FileWriter fw = new FileWriter("b.txt"); BufferedWriter bufw = new BufferedWriter(fw); 练习:将一个图片文件中数据存储到另一个文件中。复制文件。要按照以上格式自己完成三个明确。 1)源:输入流,InputStream和Reader 是否是文本?否,InputStream 源设备:硬盘上的一个文件。InputSteam体系中可以操作文件的对象是FileInputSteam 是否需要提供效率:是,BufferedInputStream BufferedInputSteambis=newBufferedInputStream(newFileInputStream("c:/users/asus/desktop/1.jpg")); 2)目的:输出流,OutputStream和Writer 是否是文本?否,OutputStream 源设备:硬盘上的文件,FileOutputStream 是否需要提高效率:是,加入BufferedOutputStream BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream("c:/users/asus/desktop/2.jpg")); 5.2 需求:将键盘录入的数据保存到一个文件中。 1)源:InputStream和Reader 是不是纯文本?是,Reader 设备:键盘。对应的对象是System.in。——为了操作键盘的文本数据方便。转成字符流按照字符串操作是最方便的。所以既然明确了Reader,那么就将System.in转换成Reader。用Reader体系中转换流,InputStreamReader InputStreamReaderisr = new InputStreamReader(System.in); 需要提高效率吗?需要,BufferedReader BufferedReaderbufr = new BufferedReader(isr); 2)目的:OutputStream Writer 是否是存文本?是!Writer。 设备:硬盘。一个文件。使用 FileWriter。 FileWriter fw = newFileWriter("c.txt"); 需要提高效率吗?需要。 BufferedWriter bufw = new BufferedWriter(fw); 5.3 扩展:想要把录入的数据按照指定的编码表(UTF-8)(默认编码表是GBK),将数据存到文件中。 目的:OutputStream Writer 是否是存文本?是!Writer。 设备:硬盘上的一个文件。使用 FileWriter。——但是FileWriter是使用的默认编码表:GBK。而存储时,需要加入指定编码表utf-8。而指定的编码表只有转换流可以指定。所以要使用的对象是OutputStreamWriter。 该转换流对象要接收一个字节输出流,而且还可以操作的文件的字节输出流:FileOutputStream OutputStreamWriter osw =new OutputStreamWriter(newFileOutputStream("d.txt"),"UTF-8"); 需要高效吗?需要,BufferedWriter BufferedWriter bufw = new BufferedWriter(osw); 记住: 转换流什么使用? 字符和字节之间的桥梁。通常,涉及到字符编码转换时,需要用到转换流。 代码示例: - 1. /*
- 2. 2、需求:想把键盘录入的数据存储到一个文件中。
- 3. 源:键盘
- 4. 目的:文件
- 5. 把录入的数据按照指定的编码表(UTF-8),将数据存到文件中。
- 6.
- 7.
- 8. 3、需求:想要将一个文件的数据打印在控制台上。
- 9. 源:文件
- 10. 目的:控制台
- 11.
- 12.
- 13. */
- 14. import java.io.*;
- 15. class TransStreamDemo2
- 16. {
- 17. public static void main(String[] args)throws IOException
- 18. {
- 19.
- 20. //键盘录入
- 21. BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
- 22.
- 23. //存入文件中,按照指定的编码表(UTF-8)
- 24. BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("readin1.txt"),"UTF-8"));
- 25.
- 26. String line=null;
- 27. while((line=br.readLine())!=null)
- 28. {
- 29. if("over".equals(line))
- 30. break;
- 31. bw.write(line);
- 32. bw.newLine();
- 33. bw.flush();
- 34. }
- 35.
- 36. /*
- 37. //录入文件数据
- 38. BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("TransStreamDemo2.java")));
- 39.
- 40. //显示在控制台
- 41. BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
- 42.
- 43. String line=null;
- 44. while((line=br.readLine())!=null)
- 45. {
- 46. if("over".equals(line))
- 47. break;
- 48. bw.write(line);
- 49. bw.newLine();
- 50. bw.flush();
- 51. }
- 52. */
- 53. }
- 54. }
复制代码
|