当前位置: 代码迷 >> Java相关 >> 黑马软件工程师系列第七篇 IO(1)
  详细解决方案

黑马软件工程师系列第七篇 IO(1)

热度:94   发布时间:2016-04-22 19:30:06.0
黑马程序员系列第七篇 IO(1)

ASP.Net+Android+IOS开发  、Net培训、期待与您交流!

 

(前言:本篇文章主要依据毕向东老师的课程视频整理而成,如要详细学习,请观看毕老师视频  百度网盘链接地址:http://pan.baidu.com/s/1mgrkJWW)

目录:1、字节流 基类InputStream\OutputStream    2、字符流 基类Reader\Writer   

      注意:由这四类派生出来的子类名称都是以其父类作为子类名的后缀。

 1、字节流 基类InputStream\OutputStream  

 

下图为字节流类体系结构图,红色部分为常用部分

 

 

举几个典型例子来更好的了解如何应用

三种以字节流形式读取指定文件输出到控制台的方法(为简便起见,都被封装于各个函数中)

 1 //读取字节流,单个字符为单位进行 2 public static void readStream(String filename){ 3      4       FileInputStream fis=null; 5     try { 6         fis=new FileInputStream(filename); 7         //以read方法的还回值为条件,判断是否读取结束,遇到非char型的就鸡鸡了 8         int cha; 9         while((cha=fis.read())!=-1){10             System.out.println((char)cha);11         }12         System.out.println("逐字符方式读取文件内容已结束...");13     } catch (FileNotFoundException e) {14         e.printStackTrace();15     } catch (IOException e) {16         e.printStackTrace();17     }finally{try {18         if(fis!=null) 19             fis.close();//读取结束,判断若流已被创建,则关闭流资源20     } catch (IOException e) {21         e.printStackTrace();22     }23     }24 }25 //读取字节流,字符数组为单位进行,比较好用26 public static void readStream1(String filename){27     28         FileInputStream fis=null;29     try {30         fis=new FileInputStream(filename);31         //定义每次读取的字符数组大小32         byte[] cha=new byte[1024];33         int len=0;34         while((len=fis.read(cha))!=-1){35             System.out.println(new String(cha,0,len));36         }37         System.out.println("逐字符数组读取结束...");38     } catch (FileNotFoundException e) {39         e.printStackTrace();40     } catch (IOException e) {41         e.printStackTrace();42     }finally{try {43         if(fis!=null) 44             fis.close();//读取结束,判断若流已被创建,则关闭流资源45     } catch (IOException e) {46         e.printStackTrace();47     }48     }49 }50 51   //慎用,读取文件太大会出问题。52 public static void readStream2(String filename){53     54       FileInputStream fis=null;55     try {56         fis=new FileInputStream(filename);57         //定义每次读取的字符数组的大小为整个文件全部58         byte[] cha=new byte[fis.available()];59         fis.read(cha);60         System.out.println(new String(cha));61         System.out.println("整篇一次性读取结束...");62         63     } catch (FileNotFoundException e) {64         e.printStackTrace();65     } catch (IOException e) {66         e.printStackTrace();67     }finally{try {68         if(fis!=null)69             fis.close();70     } catch (IOException e) {71         e.printStackTrace();72     }73     }    74 }

 

 2、字符流 基类Reader\Writer  

   下图为字节流类体系结构图,红色部分为常用部分

 

三种以字符流方式读取数据的办法

 1 //逐字符的原始读取文件中字符,读取的结果打印到控制台     2 public static void readChar(String filename){ 3      4     FileReader fr=null; 5     try { 6         fr=new FileReader(filename); 7         //以read函数返回结果来判断是否读完,进行循环 8         int cha; 9         while((cha=fr.read())!=-1){10             System.out.print((char)cha);11         }12     } catch (FileNotFoundException e) {13         e.printStackTrace();14     } catch (IOException e) {15         e.printStackTrace();16     }finally{17         try {18             if(fr!=null)  19                 fr.close();//先判断流资源是否存在,然后关闭流资源20         } catch (IOException e) {21             e.printStackTrace();22         }23     }24 }25 //以字符串数组为单位读取数据,结果打印到控制台26 public static void readChars(String filename){27     28     FileReader fr=null;29     try {30         fr=new FileReader(filename);31         //定义字符数组的大小32         char[] chars=new char[1024];33         int number;      34         while((number=fr.read(chars))!=-1){35             //将字符数组转换成字符串,打印结果36             System.out.println(new String(chars,0,number));37         }         38     } catch (FileNotFoundException e) {39         e.printStackTrace();40     } catch (IOException e) {41         e.printStackTrace();42     }finally{43         try {44             if(fr!=null) 45                 fr.close();//先判断流资源是否存在,然后关闭流资源46         } catch (IOException e) {47             e.printStackTrace();48         }49     }50 }51 //字符操作,以字符串数组为单位读取数据,结果打印到控制台并且将行数打印出。增加了一个缓冲区,提高读取效率。52 public static void bufferReader(String filename){53     54      LineNumberReader buff=null;55     try {56         buff=new LineNumberReader(new  FileReader(filename));        57         buff.setLineNumber(0);//指定行号58         59         String line;60         while((line=buff.readLine())!=null){61             System.out.println(buff.getLineNumber()+":"+line);//打印带行号的内容62         }63     } catch (FileNotFoundException e) {64         e.printStackTrace();65     } catch (IOException e) {66         e.printStackTrace();67     }finally{68         try {69           if(buff!=null)70             buff.close();//先判断流资源是否存在,然后关闭流资源71         } catch (IOException e) {72             // FIXME Auto-generated catch block73             e.printStackTrace();74         }75     }76 }

 

 两种方式从控制台读取字符存入自定文件中

 1 //字符操作,读取控制台录入,读到kill行结束操作,保存到filename.txt文件中,以行为单位操作     2     public static void write(String filename){ 3             //读取控制台录入    4             System.out.println("请录入(kill为结束命令,文件保存位置-"+filename+"):"); 5              BufferedReader buff=null;         6             FileWriter fw=null; 7             try {     8                 buff = new BufferedReader(new InputStreamReader(System.in)); 9                 fw = new FileWriter(filename,true);10                 //只要读的行数据不为空就循环向文件中写数据11                 String line;12                 while((line=buff.readLine())!=null){13                     if(line.equals("kill")) 14                         break; 15                         fw.write(line);                        16                 }17                 System.out.println("录入已经结束...");//录入结束提示18             } catch (IOException e) {19                 e.printStackTrace();20             }finally{21                 try {22                     if(fw!=null)  23                         fw.close();//关闭流资源24                 } catch (IOException e) {25                     e.printStackTrace();26                 }27                 try {28                     if(buff!=null)  29                         buff.close();//关闭流资源30                 } catch (IOException e) {31                     e.printStackTrace();32                 }    33         }34     }35     //字符操作,读取控制台录入,保存到filename.txt文件中,加了一个缓冲区,提高存储效率36     public static void bufferWriter(String filename){37         38         BufferedWriter buffwr=null;39         BufferedReader buffre=null;40         try {41               FileWriter fw=new FileWriter(filename,true);42               buffre=new BufferedReader(new InputStreamReader(System.in)); 43               buffwr=new BufferedWriter(fw);44               System.out.println("请录入(kill为结束命令,文件保存位置-"+filename+"):");45               46               String line;47               while((line=buffre.readLine())!=null){48                   if(line.equals("kill")) 49                       break;50                   buffwr.write(line);51                   buffwr.newLine();//将换行符读进保存52               }53              System.out.println("录入已经结束...");54               55         } catch (IOException e) {56             e.printStackTrace();57         }finally{    58                 try {59                     if(buffwr!=null)60                     buffwr.close();61                 } catch (IOException e) {62                     e.printStackTrace();63                 }64                 try {65                     if(buffre!=null)66                     buffre.close();67                 } catch (IOException e) {68                     e.printStackTrace();69                 }70         }71     }    

 

两种文本文件拷贝方式

 1 //复制文本文件,从from到to 2 public static void copyTxt(String from,String to){ 3        //定义读写文件     4     FileReader fr=null; 5     FileWriter fw=null; 6          7     try { 8         //创建读写文件对象 9         fr=new FileReader(from);10         fw=new FileWriter(to,true);11         //定义数组大小12         char[] buff=new char[1024];13         int num;14         while((num=fr.read(buff))!=-1){15             fw.write(buff, 0, num);16         }17         System.out.println("文件已经从   "+from+"  文件夹复制到了   "+to+"  文件夹...");18     } catch (IOException e) {19         e.printStackTrace();20     }finally{21         try {22             if(fr!=null) 23                fr.close();24         }25         catch (IOException e) {26             e.printStackTrace();27         }28         try{29             if(fw!=null)  30                 fw.close();31         }32         catch (IOException e) {33             e.printStackTrace();34         }35     }36 }37 //用装饰类保证一下,提高效率38 public static void bufferCopyTxt(String from,String to){39     40         BufferedReader br=null;41         BufferedWriter bw=null;        42     try {        43         br=new BufferedReader(new FileReader(from));44         bw=new BufferedWriter(new FileWriter(to));45         46         String line;47         while((line=br.readLine())!=null){48             bw.write(line);49             bw.flush();50         }51         System.out.println("文件已经从   "+from+"  文件夹复制到了   "+to+"  文件夹...");        52     } catch (IOException e) {53         e.printStackTrace();54     }finally{        55             try {56                 if(br!=null)57                 br.close();58             } catch (IOException e) {59                 // FIXME Auto-generated catch block60                 e.printStackTrace();61             }62             try {63                 if(bw!=null)64                 br.close();65             } catch (IOException e) {66                 // FIXME Auto-generated catch block67                 e.printStackTrace();68             }69     }70 }

 

复制图片的操作,图片必须以字节流的方式操作

 1 //复制图片,从from文件到to文件。用到字节流 2 public static void copyImag(String from,String to){ 3     //定义输入输出字节流 4     FileInputStream fis=null; 5     FileOutputStream fos=null; 6      7     try { 8         fis=new FileInputStream(from); 9         fos=new FileOutputStream(to);10         //定义每次复制的单位字符数组大小11         byte[] cha=new byte[1024];12         int len=0;13         while((len=fis.read(cha))!=-1){14             fos.write(cha,0,len);15         }16     } catch (FileNotFoundException e) {17         e.printStackTrace();18     } catch (IOException e) {19         e.printStackTrace();20     }finally{21         try {if(fis!=null)22                fis.close();23         } catch (IOException e) {24             // FIXME Auto-generated catch block25             e.printStackTrace();26         }27         try {if(fis!=null)28                fis.close();29         } catch (IOException e) {30             // FIXME Auto-generated catch block31             e.printStackTrace();32         }33     }34 }

 

 

 

       初学者难免错误,欢迎评判指教,持续更正ing...........

 

ASP.Net+Android+IOS开发  、Net培训、期待与您交流!

  相关解决方案