黑马程序员技术交流社区

标题: day19 IO流总结 [打印本页]

作者: 牛德阳    时间: 2016-1-1 22:41
标题: day19 IO流总结
本帖最后由 牛德阳 于 2016-1-1 22:49 编辑

Reader:用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。

Writer:写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()
  1. package day18;

  2. import java.io.*;

  3. /*把文件内容拷贝到另一个文件*/
  4. public class filelianxi {

  5.         public static void main(String[] args) throws IOException {
  6.                 //copy1();
  7.          copy2();
  8.         }
  9.         
  10.         public static void copy1() throws IOException//第一种拷贝方法
  11.         {
  12.                 FileReader fr=new FileReader("c:\\ioException.txt");
  13.                 FileWriter fw=new FileWriter("c:\\ioException.java");
  14.                 int num;
  15.                 while((num=fr.read())!=-1)
  16.                 {
  17.                         fw.write(num);

  18.                 }
  19.                 fr.close();
  20.                 fw.close();
  21.         }
  22.         public static void copy2() // 第二中拷贝方法 {
  23.                 FileReader fr=null;
  24.                 FileWriter fw = null;
  25.                   try {
  26.                         fr =  new FileReader("c:\\ioException.txt");
  27.                         char[] arr=new char[1024];
  28.                          fw =   new FileWriter("c:\\ioException1.java");
  29.                         
  30.                         int length=0;
  31.                           while((length=fr.read(arr))!=-1)
  32.                           {
  33.                                   fw.write(arr, 0, length);
  34.                                 
  35.                           }
  36.                 }
  37.                 catch (IOException e) {
  38.                         
  39.                         e.printStackTrace();
  40.                 }
  41.                  
  42.         finally{
  43.                 try {
  44.                         if(fr!=null)
  45.                         fr.close();
  46.                 } catch (IOException e) {
  47.                         
  48.                         e.printStackTrace();
  49.                 }
  50.                 try {
  51.                         if(fw!=null)
  52.                         fw.close();
  53.                 } catch (IOException e) {
  54.                         
  55.                         e.printStackTrace();
  56.                 }
  57.                 }
  58.         }}
复制代码
BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 可
以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
自定义BufferedReader实现其功能
  1. package day19;

  2. import java.io.FileReader;
  3. import java.io.IOException;

  4. public class myBufferedReader {

  5.         private FileReader fr;
  6.         public myBufferedReader(FileReader fr)//构造方法
  7.         {
  8.                 this.fr=fr;
  9.         }
  10.         
  11.         public String myReadLine() throws IOException//实现ReadLine()功能
  12.         {
  13.                 StringBuffer sb=new StringBuffer();
  14.                 int ch=0;
  15.                 while((ch=fr.read())!=-1)
  16.                 {
  17.                         if(ch=='\r')
  18.                                 continue;
  19.                         if(ch=='\n')//window里回车符是\r\n读到\n的时候行读取完毕返回字符串
  20.                                 return sb.toString();
  21.                         else
  22.                                 sb.append((char)ch);
  23.                 }
  24.                 if(sb.length()!=0)
  25.                         return sb.toString();
  26.                 return null;
  27.         }
  28.         
  29.         public void myclose() throws IOException{
  30.                 fr.close();//关闭FileReader流
  31.         }
  32. }
复制代码



BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写
入。
下面是用BufferedReaer和BufferedWriter拷贝文件的例子:
  1. package day19;

  2. import java.io.*;

  3. public class buffercopydemo {

  4.         public static void main(String[] args) {
  5.                 BufferedWriter  bufw=null;
  6.                 BufferedReader  bufr=null;
  7.                 try
  8.                 {
  9.                         bufr=new BufferedReader(new FileReader("bufferwriterdemo.java"));
  10.                         bufw=new BufferedWriter(new FileWriter("buf.txt"));
  11.                         String line=null;
  12.                         while((line=bufr.readLine())!=null)
  13.                         {
  14.                                 bufw.write(line);
  15.                                 bufw.flush();
  16.                                 bufw.newLine();
  17.                         }
  18.                 }
  19.                 catch(IOException e)
  20.                 {
  21.                         throw new RuntimeException("读写失败");
  22.                 }
  23. finally
  24.     {
  25.            try
  26.            {
  27.                    if(bufw!=null)
  28.                {
  29.                     bufw.close();
  30.                 }
  31.                    if(bufr!=null){ bufr.close();}
  32.            }
  33.            catch(IOException e){
  34.                    throw new RuntimeException("读写失败");
  35.            }
  36.     }
  37.         }

  38. }
复制代码

LineNumberReader : 跟 踪 行 号 的 缓 冲 字 符 输 入 流 。 此 类 定 义 了 方 法 setLineNumber(int) 和
getLineNumber(),它们可分别用于设置和获取当前行号。
自定义LineNumberReader 实现该类的功能
  1. package day19;

  2. import java.io.FileReader;
  3. import java.io.IOException;

  4. public class myLineNumberReader extends myBufferedReader {
复制代码
InputStream:是表示字节输入流的所有类的超类。
FileInputStream:从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环
FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。
OutputStream:此抽象类是表示输出字节流的所有类的超类。
FileOutputStream:文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。

以下是字节流读取文件的三种方式:
  1. package day19;

  2. import java.io.*;

  3. public class fileStream1 {

  4.         public static void main(String[] args) throws IOException {
  5. FileOutputStream fos=new FileOutputStream("buf.txt");
  6.                 FileInputStream fis=new FileInputStream("buf.txt");
  7. write(fos);
  8. read_1(fis);
  9. read_2(fis);
  10.                 read_3(fis);
  11.         }
  12.           public static void write(FileOutputStream fos) throws IOException
  13.             {
  14.                     fos.write("niudeyang".getBytes());//将字符串转换成字节数组写入文件中
  15.                     fos.close();
  16.             }
  17.     public static void read_1(FileInputStream fis) throws IOException//第一种读取方式
  18.     {
  19.             int i;
  20.             while((i=fis.read())!=-1)
  21.             {
  22.                     System.out.print((char)i);
  23.             }
  24.             fis.close();
  25.     }
  26.     public static void read_2(FileInputStream fis) throws IOException//第二种读取方式把读取内容放入创建的字节数组中
  27.     {
  28.             byte[] b=new byte[1024];//数组长度为1024的整数倍
  29.             int i=0;
  30.             while((i=fis.read(b))!=-1)
  31.             {
  32.                     System.out.println(new String(b,0,i));
  33.             }
  34.             fis.close();
  35.     }
  36.     public static void read_3(FileInputStream fis) throws IOException
  37.     {
  38.             byte[] b=new byte[fis.available()];//利用fis.available()设置数组大小提高效率无需循环
  39.             
  40.             fis.read(b);
  41.             
  42.                     System.out.println(new String(b));
  43.    
  44.             fis.close();
  45.     }
  46. }
复制代码
  1. package day19;
  2. /*用实现缓冲的字节流拷贝MP3文件<span style="line-height: 2.2em;">*/</span>
复制代码
  1. package day19;

  2. import java.io.*;


  3. public class transStream2 {
  4. /*1.需求1:从键盘输入并打印一行数据
  5. * 需求2:读取文件中内容并打印
  6. * 需求3:从键盘输入数据存储在文件
  7. */
  8.         public static void main(String[] args) throws IOException {
  9.                
  10.      xuqiu_1();
  11.        xuqiu_2();
  12.                 xuqiu_3();
  13.                
  14.         }

  15. private static void xuqiu_3() throws IOException {//需求3:从键盘输入数据存储在文件中
  16.          BufferedReader br=new BufferedReader(new  InputStreamReader(System.in));
  17.          BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("buf.txt",true),"UTF-8"));
  18.              String str=null;
  19.              while((str=br.readLine())!=null){
  20.                   bw.write(str.toUpperCase());
  21.                   bw.flush();
  22.                   ;
  23.           }
  24.           br.close();
  25.         bw.close();
  26. }

  27. private static void xuqiu_2() throws IOException {//需求2:读取文件中内容并打印
  28.          BufferedReader br=new BufferedReader( new FileReader("buf.txt"));
  29.          BufferedWriter bw=new BufferedWriter(new  OutputStreamWriter(System.out));
  30.          String str=null;
  31.              while((str=br.readLine())!=null){
  32.                   bw.write(str.toUpperCase());
  33.                   bw.flush();
  34.                   ;
  35.           }
  36.           br.close();
  37.         
  38.         
  39. }

  40. private static void xuqiu_1() throws IOException {//需求1:从键盘输入并打印一行数据
  41.          BufferedReader br=new BufferedReader(new  InputStreamReader(System.in));
  42.          BufferedWriter bw=new BufferedWriter(new  OutputStreamWriter(System.out));
  43.          String str=null;
  44.              while((str=br.readLine())!=null){
  45.                   if("over".equalsIgnoreCase(str))
  46.                           break;
  47.                   bw.write(str.toUpperCase());
  48.                   bw.flush();
  49.                   ;
  50.           }
  51.           br.close();
  52.         
  53. }


  54. }
复制代码







作者: Garnet92    时间: 2016-1-2 11:35
一直比较迷茫  看了  这个    有点思路了  多谢分享
作者: Garnet92    时间: 2016-1-2 11:36
60分  已经很不错了    继续努力
作者: yehua1026    时间: 2016-1-2 12:09
非常好!!!
作者: 337325635    时间: 2016-1-2 21:46
明天才开始学 ,正好可以复习




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