黑马程序员技术交流社区

标题: 【笔记整理】流操作的基本规律 [打印本页]

作者: ywen_chan    时间: 2015-4-29 17:57
标题: 【笔记整理】流操作的基本规律
读取键盘的录入:
System.out:对应的是标准的输出设备,控制台
System.in:对应的而是标准的输入设备,键盘输入
例子:
  1. import java.io.*;
  2. class ReadIn
  3. {
  4.          pubic static void main(String[] args)
  5. {
  6.          InputStream in =System.in;
  7.          int by = in.read();//只录入了一个字节;
  8.          System.out.println(by);

  9. }
  10. }
复制代码
练习:连续录入,当录入一行数据之后会,就将该行数据进行打印。如果录入的数据是over,那么停止录入。
  1. imprt java.io.*;
  2. class ReadIn
  3. {
  4.          public statc void main(String[] args)
  5. {
  6. InputStream in =System.in;
  7. StringBuilder sb =new StringBuilder();
  8. while(ture)
  9. {
  10.          int ch=in.read();
  11.          if(ch==’\r’)
  12.                    continue;
  13.          if(ch==’\n’)
  14.          {
  15.                    String s=sb.toString();
  16.                    if (“over”.equals(s))
  17.                             break;
  18.                    System.out.println(s.toUpperCase());
  19.                    sb.delete(0,sb.length()); //清空缓冲区
  20. }
  21. else
  22. sb.append((char)ch);
  23. }
  24. }
  25. }
复制代码
读取转换流:字节转字符
  1. imprt java.io.*;
  2. classTransStreamDemo
  3. {
  4.          public statc void main(String[] args) throws IOException
  5. {
  6.          InputStream in =System.in;
  7.          InputStreamReader isr=new InputStreamReader(in);
  8.          BufferedReader buff =new BufferedReader(isr);
  9.          String line=null;
  10.          whie((line=buff.readline())!=null)
  11.          {
  12.                    if(“over”.equals(line))
  13.                             break;
  14.                    System.out.println(line.toUppercase());
  15. }
  16. bufr.close();
  17. }
  18. }
复制代码
写入转换流:
字符转字节;OutputStreamWriter
  1. OutStream out=System.out;
  2. OutputStreamWriter osw=new OutputStreamWriter(out);
  3. BufferedWriter  bufw=new BufferedWriter(osw);
  4. String line =null;
  5. while (line=bufr.readline()!=null)
  6. {
  7.          if(“over”.equals(line))
  8.                    break;
  9.          //osw.write(line.toUpperCase());
  10.          //osw.flush();//字符流是带缓冲区,所以要刷新
  11.          bufw.write(line.toUpperCase());
  12.          bufw.newLine();
  13.          bufw.flush();
  14. }
  15. bufr.close();
复制代码
以上可以转换成两句搞定:牢记,规律
--键盘录入:     BufferedReader bufr = newBufferedReader(new InputStreamReader(System.in));
--控制台输出:   BufferedWriter buwr = newBufferedWriter (new OutputStreamWriter(System.out));
如要将键盘录入的信息写入到文件当中,那么只需修改一下就得了
                            BufferedWriterbuwr = newBufferedWriter (new FileOutputStream(“out.txt”));
若要将一个文件的数据打印在控制台上,那么修改一下就行了
                             BufferedReaderbufr =  newBufferedReader(new FileInputStream(“CopyPic.java”));
流操作的基本规律:
最痛苦的是流对象很多,不知道该用哪一个;通过三个明确来完成,
1、 明确源和目的
源:输入流InputStream 、Reader;目的:输出流OutputStream、Writer
2、 明确操作的数据是否是纯文本
是:用字符流;否:字节流
3、 当体系明确后,在明确要使用哪个具体的对象,通过设备来进行区分:源设备包括内存,硬盘,键盘;目的设备有内存、硬盘,控制台
需求1、将一个文本文件中的数据存储到另一个文件中,即复制文件
                   分析:源是文本文件,所以使用读取流,InputStreamReader
                                     是不是操作文本文件,是就选择Reader
                                     接下来明确设备:为硬盘上面的一个文件
                                     那么Reader体系中可以操作文件的对象是FileReader
                            是否需要提高效率,是就需要加入Reader体系中的缓冲区BufferedReader
目的:OutputStream Writer
         是否是纯文本,是就选择Writer,设备是硬盘,一个文件,那么采用Writer体系中可以操作文件的对象FileWriter。是否需要提高效率,是就需要加入Writer体系中的缓冲区BufferedWriter
需求2、将键盘录入的数据存储在一个文件中:
源:InputStreamReaer
是不是纯文本?是,采用Reader体系
设备:键盘(字节流)。对应的对象时Syetem.in
那么这不是应该选择Reader吗?System.in对应的不是字节流吗?为了操作键盘的文本数据方便,键盘录入应转换成字符串操作是最方便的。所以既然明确了Reader,那么久将System.in转换成字符流,那么用到了Reader体系中的转换流,InputStreamReader
代码规范如下:
InputStreamReader  Isr= new InputStreamReader(System.in);
需要提高效率吗?需要!BufferedReader
那么BufferedReader bufr=new BufferedReader(isr);
目的: OutputStream Writer
是否是存纯文本?是!采用Writer体系
设备:硬盘。一个文件,那么采用FileWriter
那么:FileWriter fw =new FileWriter(“c.txt”);
需要提高效率吗?需要!那么BufferedWriter  bufr =new BufferWriter(fw);
4、 扩展:想要把录入的数据按照指定的编码表(UTF-8)存在文件中。
目的: OutputStream Writer
是否是存纯文本?是!采用Writer体系
设备:硬盘。一个文件,那么采用FileWriter,但是FileWriter是使用默认的编码表GBK
但是存储是,需要加入指定的编码表(UTF-8),而指定的编码表只有转换流可以指定,所以要使用的对象是OutputStreamWriter,而该转换流对象要接收一个字节输出流,而且还可以操作文件的字节输出流。FileOutStream
代码:OutputStreamWriter asw =
newOutputSteramWriter(new FileOututStream(“d.txt”),”UTF-8”)
需要提高效率吗?需要!那么BufferedWriter  bufr =new BufferWriter(osw);
所以,记住,转换流什么时候使用,转换流是字符与字节之间的桥梁,通常涉及到字符编码转换是,需要用到转换流。


作者: 海带    时间: 2015-4-29 20:42
不错 赞一个
作者: 罗韬    时间: 2015-4-29 21:28
不错,分享一个
作者: 黄文昭    时间: 2015-4-29 22:25
很好的分享!
作者: ywen_chan    时间: 2015-4-29 23:22
黄文昭 发表于 2015-4-29 22:25
很好的分享!

多谢支持




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2