黑马程序员技术交流社区

标题: IO 总结 part 1 [打印本页]

作者: fmi110    时间: 2015-8-9 21:38
标题: IO 总结 part 1
IO
  1. 字符流和字节流的区别:
  2.         1、字节流是读到一个字节就返回一个字节。
  3.                 字符流调用字节流读取一个或多个字节,然后对照指定的编码表,返回对应的字符
  4.         2、字节流可以处理所有的数据
  5.                 字符流只能处理字符数据

  6. IO体系的基本功能读和写
  7.         字符: Reader                Writer
  8.         字节: InputStream        OutputStream

  9. Reader 常用方法:
  10.         int read();  返回读取的字符对应的整数,结尾时返回-1
  11.         int read(char[]); 返回读取字符的个数,结尾返-1
  12.         void close();可能会抛出异常,需要处理

  13. Writer 常用方法:
  14.         write(ch); 写一个字符到流
  15.         write(char[],offset,length);
  16.         write(string);
  17.         flush();刷新流
  18.         close();关闭流,会自动调用flush(),刷新流

  19. FileWriter :
  20.         该类没有自己特有的方法,只有自己的构造器
  21.         特点:
  22.                 1、用于处理文本文件
  23.                 2、该类有默认的编码表。 GBK
  24.                 3、该类有临时缓冲

  25.         构造器:在写入流对象初始化时,必须关联一个数据存储的目的地(硬盘文件)
  26.                 FileWriter(String fileName); 会将同名文件删除,然后新建一个

  27.                 FileWriter(String fileName,boolean append)
  28.                         当 append 为 true 时,会将数据流添加到文件末尾 而不是覆盖原文件
  29. FileReader:
  30.         1、用于读取文本文件的流对象
  31.         2、用于关联文本文件

  32.         构造函数: FileReader(String fileName)
  33.                 fileName必须是已存在的文件,否则抛出异常 FileNotFoundException

  34. 文本写入代码演示

  35. class Demo
  36. {
  37.         public static void main(String[] args)
  38.         {
  39.                 FileWriter fw = null;
  40.                 try
  41.                 {
  42.                         fw = new FileWriter("Demo.txt");

  43.                         fw.write("This is a demo of writing chars...");
  44.                         fw.flush();
  45.                 }
  46.                 catch (IOException e)
  47.                 {
  48.                         System.out.pringtln(e.toString());
  49.                 }
  50.                 finally
  51.                 {
  52.                         try
  53.                         {
  54.                                 if(fw!=null)
  55.                                         fw.close();
  56.                         }
  57.                         catch (IOException e)
  58.                         {
  59.                                 System.out.pringtln(e.toString());
  60.                         }
  61.                 }
  62.         }
  63. }

  64. class ReaderDemo
  65. {
  66.         public static void main(String[] args) throws IOException
  67.         {
  68.                 FileReader fr = new FileReader("demo.txt");

  69.                 int ch = 0 ;
  70.                 whlie((ch=fr.read())!=-1)
  71.                 {
  72.                         System.out.println((char)ch);//返回的是一个字节的整形,需要强转成字符
  73.                 }
  74.                 fr.close();
  75.         }
  76. }

  77. 字符流缓冲区:
  78.         缓冲区出现的目的是提高对流的操作效率
  79.         原理:用数组对流进行存储,减少对对磁盘的读取次数
  80.         对应的类:
  81.                 BufferedWriter(FileWriter fw)
  82.                         特有方法:
  83.                                 newLine(); 跨平台的换行符
  84.                
  85.                 BufferedReader(FileReader fr)
  86.                         特有方法:
  87.                                 readLine();以行为单位进行读取,返回行标记之前的内容,不返回行标记
  88.                                                         读到末尾时返回 null

  89.         注意:缓冲区是为了增强流的功能而存在,所以新建缓冲区对象,必须关联已经存在的流对象。
  90.         否则,将出现异常。

  91. 练习:通过缓冲区进行文本的拷贝

  92. class BufferedDemo
  93. {
  94.         public static void main(String[] a) throws IOException
  95.         {
  96.                 BufferedReader bufr = new BufferedReader(new FileReader("demo.txt"))'
  97.                 BufferedWriter bufw = new BufferedWriter(new FileWriter("copy.txt"));
  98.                 //以行为单位读取
  99.                 String line = null;
  100.                 while((line=bufr.readLine())!=null)
  101.                 {
  102.                         bufw.write(line);
  103.                         bufw.newLine();//换行
  104.                         bufw.flush();//刷新
  105.                 }
  106.                 bufw.close();
  107.                 bufr.close();
  108.         }
  109. }

  110. readLine() 方法的原理:缓冲区对象,调用与之关联的流对象的read的方法读取字符,
  111.                                                 但不是马上进行具体的操作,而是先进行判断,只有读取换行符时
  112.                                                 才进行操作,否则现将读到的字符进行临时存储。当读到换行符时,
  113.                                                 将临时存储区的数据一次性返回。

  114. class MyReadLine()
  115. {
  116.         private Reader r;
  117.         MyreadLine(Reader r)
  118.         {
  119.                 this.r = r;
  120.         }
  121.         public String readline() throws IOException
  122.         {
  123.                 //建立临时存储区
  124.                 StringBuilder sb = new StringBuilder();
  125.                 int ch = 0;
  126.                 while((ch=r.read())!=-1)
  127.                 {
  128.                         if(ch=="\r")
  129.                                 continue;
  130.                         if(ch=="\n")
  131.                                 return sb.toString();
  132.                         else
  133.                                 sb.append((char)ch);//返回的是int型,需要强转
  134.                 }
  135.                 if(sb.length()!=0)//不是换行符结尾,需要判断是否有字符
  136.                         return sb.toString();
  137.                 else
  138.                         return null;
  139.         }
  140.         public void close() throws IOException
  141.         {
  142.                 r.close();
  143.         }
  144. }
  145.        
  146. 装饰设计模式:基于对象的功能,并将其功能增强。

  147.         与继承的区别:
  148.                 1、比继承有更好的灵活性
  149.                 2、通常装饰类和被装饰类都具有相同的父类或者实现了相同的接口

  150. 练习:编写 LineNumberReader 中的 getLineNumber() 和 setLineNumber() 方法

  151. class MyLineNumberReader extends MyReaderLine
  152. {
  153.         private Reader() r;
  154.         private int lineNumber = 0;
  155.         MyLineNumberReader(Reader r)
  156.         {
  157.                 super(r);//调用父类的构造器初始化
  158.         }
  159.         public void setLineNumber(int num)
  160.         {
  161.                 this.lineNumber = num;
  162.         }
  163.         public String readLine() throws IOException
  164.         {
  165.                 lineNumber++;
  166.                 return super.readLine();//直接调用父类的方法
  167.         }
  168.         public int getLineNumber()
  169.         {
  170.                 return lineNumber;
  171.         }
  172. }
复制代码

作者: fmi110    时间: 2015-8-9 21:39
自己顶贴 加油
作者: 谭威威威威    时间: 2015-8-9 21:58





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