黑马程序员技术交流社区

标题: 【笔记整理】IO流的缓冲区部分笔记整理 [打印本页]

作者: ywen_chan    时间: 2015-4-28 10:38
标题: 【笔记整理】IO流的缓冲区部分笔记整理
字符流的缓冲区
l   缓冲区的出现提高了对数据的读写效率
l   对应的类:
BufferWriter
BufferReader
l   缓冲区要结合流才可以使用。
l   在流的基础上对流的功能惊醒了增强。
l   BufferWriter,将文本写入字符输出流,创建之前必须先有流。
缓冲区的出现是为了提高流的操作效率未出现,所以在创建缓冲区之前,必须现有流对象
  1. import java.io.*;
  2. class BufferWriterDemo
  3. {
  4.          //创建一个字符写入对象。
  5.          FileWriter fw=new FileWriter(“buf.txt”);
  6. //为了提高字符写入流效率,加入了缓冲技术
  7. //只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。
  8. BufferWriter bufw=new BufferWriiter(fw);
  9. bufw.write(“abgad”);
  10. //记住,只要用到缓冲区,就必要要刷新
  11. bufw.flush();
  12. //其实关闭缓冲区,就是在关闭缓冲区中的流对象
  13. bufw.close();
  14. //fw.close();//所以此行不用再写。
  15. }
复制代码
读取流缓冲区BufferReader
  1. import java.io.*;
  2. class BufferreaderDemo
  3. {
  4. public static void main(String[] args) throws IOException
  5. {
  6.                    //创建一个读取流对象和文件相关联
  7.                    FileReader fr-new FileReader(“buf.txt”);
  8.                    //为了提高效率,加入了缓冲技术。将字符流读取对象作为参数传递给缓冲对象的构造函数。
  9.                    BufferReader bufr=new BufferReader(fr);
  10.                    String line=null;
  11.                    while(line=bufr.readline()!=null)
  12. {
  13.          //该缓冲区提供了一个一次读一行的方法readline。方便于对文本数据的获取。当返回null时,表示读到了文本的末尾。
  14.          System.out.println(line);
  15. }
  16. bufr.close();
  17. }
  18. }
复制代码
readline方法的原理,无论是读一行,或者读取多个字符,其实最终都是在硬盘上一个一个的读取,所以最终使用的还是read方法一次读一个的方法。  
装饰设计模式:
装饰设计模式:当想要对已有的对象进行功能增强是,可以定义一个类,将已有对象传入,基于已有的功能,并提供加强功能。那么自定义的该类就叫装饰类。装饰类通常通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
装饰与继承的区别:
装饰类比继承要灵活,避免了继承体系的臃肿,而且降低了类与类之间的关系。装饰类韵味增强已有对象,具备的功能和已有也是相同的 ,只不过提供了更强的功能,所以装饰类和被装饰类通常都是一个体系中的。
例子:
  1. class Person
  2. {
  3.          publc void chifan(){
  4.          System.out.println(“chifan”);                  }
  5. }
  6. class SuerPerson
  7. {
  8.          SuperPerson(Person p);;
  9.          {
  10.                    this.p=p;
  11. }
  12. public void superchifan()
  13. {
  14.          p.chifan();        
  15. System.out.println(“tiandian”);      
  16. System.out.println(“laiyigen”);      
  17. }
  18. }
  19. class Person
  20. {
  21.          public static void mian(String[] args)
  22.          {
  23.          Person p=new Person();
  24.          //p.chifan();}
  25.          SuperPerson sp =new SuperPerson();
  26.          sp.superchifan();
  27. }
  28. LineNumberReader获取行号:
  29. import java.io.*;
  30. class LineNumberReaderDemo
  31. {
  32. public static void main(String[] args) throws IOException
  33. {
  34.                    FileReader fr=new FileReader(“PersonDemo.java”);
  35.                    LineNumberReader lnr=new LineNumberReader(fr);
  36.                    String line=null;
  37.                    lnr.setLineNumber(100);//设置行号,从100开始显示
  38.                    whle(line=lnr.readline()!=null)
  39. {
  40.          System.out.println(lnr.getLineNumber()+”:”+line);//获取行号并打印;
  41. }
  42. lnr.close();
  43. }
  44. }
复制代码
字节流IntputStreamOutputStream
需求,想要操作图片数据,这时候需要用到字节流;字节流对象:FileStream
字节操作,不需要刷新,一个字节一个字节写,读。
例子:写
  1. import java.io.*;
  2. class FileStream
  3. {
  4.          public static void main(String[] args);throws IOException
  5.          {
  6.                    writeFile();
  7. }
  8. public static void writeFile() throws IOException
  9. {
  10.          FileOutputStream fos = new FileOutputStream(“fos.txt”);
  11.          fos.write(“afiegg”.getBytes());//将字符串转换成字节数组
  12.          fos.close();//关闭资源,不是关闭刷新
  13. }
  14. }
复制代码
读:(一个字节一个字节读取)
  1. import java.io.*;
  2. class FileStream
  3. {
  4.          public static void main(String[] args);throws IOException
  5.          {
  6.                    raedFile();//一个字节一个字节的读取。
  7.                    readFile_2();//读取到字节存储在字节数组当中,然后一次性打印
  8.                    readFlie_3();
  9. }
  10. public static  void readFile() throws IOException
  11. {
  12.          FileInputStream fos = new FileIntputStream(“fos.txt”);
  13.          int ch=0;
  14.          while(ch=fos.read()!=-1)
  15.          {
  16.                    System.out.println((char)ch);
  17. }
  18. fos.close;
  19. }
  20. public static  void readFile_2() throws IOException
  21. {
  22.          FileInputStream fis = new FileIntputStream(“fos.txt”);
  23.          byte[] buf=new byte[1024];
  24.          int len=0;
  25.          while ((len=fis.read(buf)!=-1))
  26. {
  27.          System.out.println(new String(buf,0,len));
  28. }                  
  29. fis.close();
  30. }
  31. public static  void readFile_3() throws IOException
  32. {
  33. FileInputStream fis = new FileIntputStream(“fos.txt”);
  34. //int num=fis.available();//获取文件的大小
  35. //System.out.println(“num=”+num);
  36. byte[] buf =new byte[fis.available()];//定义一个刚刚好的缓冲区,不用再循环了
  37. fis.read(buf);
  38. System.out.println(new String(buf));
  39. fis.close();
  40. }
  41. }
复制代码
例子,  复制一个图片;
思路:
1、 用字节读取流对象和图片关联 2、 用字节写入流对象创建一个图片文件,用于存储获取到的图片数据。3、 通过循环读写,完成数据的存储。4、 关闭资源。
  1. import java.io.*;
  2. class CopyPic
  3. {
  4.          public static void main(String[] args)
  5.          {
  6.          FileOutputStream fos=null;
  7.          FileInputStream fis =null;
  8. try
  9. {
  10.                    fos=new FileOutputStream("c:\\2.tmp");
  11.                    fis=new FileInputStream("c:\\1.tmp");
  12.                    byte[] buf = new byte[1024];
  13.                    int len=0;
  14.                    while((len=fis.read(buf))!=-1)
  15.                    {
  16.                             fos.write(buf,0,len);
  17. }
  18. }
  19. catch(IOException e)
  20. {
  21.                    throw new RuntimeException("复制文件失败");
  22. }
  23. finally
  24. {
  25.                    try
  26.                    {
  27. if(fis!=null)
  28.                    fis.close();
  29. }
  30. catch(IOException e)
  31. {
  32.                    throw new RuntimeException("读取关闭失败");
  33. }
  34. }
  35. try
  36.                    {
  37. if(fos!=null)
  38.                    fos.close();
  39. }
  40. catch(IOException e)
  41. {
  42.                    throw new RuntimeException("写入文件失败");
  43. }

  44.          }
  45. }
复制代码
字节流的缓冲区演示:
MP3 的复制:BufferOutputStream   BufferInputStream
  1. import java.io.*;
  2. class CopfMp3
  3. {
  4.          public statc void main(String[] args)
  5.          {
  6.                    long start =System.currentTimeMillis();
  7.                    copy_1();
  8.                    long end =System.currentTimeMillis();
  9.                    System.out.println((end-start)+”毫秒”);
  10. }
  11. public static void copy_1()
  12. {
  13.          BufferInputStream bufis=new BufferInputStream(new FileInputStream(“c:\\0.mp3”));
  14. BufferOutputStream bufos=new BufferOutputStream(new FileOutputStream(“c:\\1.mp3”));
  15. int by=0;
  16. while((by=buffis.read())!=-1)
  17. {
  18.          bufos.write(by);
  19. }
  20. bufos.close();
  21. bufis.close();
  22. }
  23. }
复制代码
待续.....

作者: forplay    时间: 2015-4-28 10:49
学习了,楼主你继续
作者: ywen_chan    时间: 2015-4-28 20:56
forplay 发表于 2015-4-28 10:49
学习了,楼主你继续

嗯嗯,多点研究毕老师那些例子,对我们有很大的帮助
作者: kolyneh    时间: 2015-4-28 21:48
学习了,加油!




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