zoukankan      html  css  js  c++  java
  • 黑马程序员系列第七篇 IO(1)

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

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

    目录:1、字节流 基类InputStreamOutputStream    2、字符流 基类ReaderWriter   

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

     1、字节流 基类InputStreamOutputStream  

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

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

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

     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、字符流 基类ReaderWriter  

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

     

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

     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 block
    73             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 block
    60                 e.printStackTrace();
    61             }
    62             try {
    63                 if(bw!=null)
    64                 br.close();
    65             } catch (IOException e) {
    66                 // FIXME Auto-generated catch block
    67                 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 block
    25             e.printStackTrace();
    26         }
    27         try {if(fis!=null)
    28                fis.close();
    29         } catch (IOException e) {
    30             // FIXME Auto-generated catch block
    31             e.printStackTrace();
    32         }
    33     }
    34 }

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

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

  • 相关阅读:
    禅知Pro 1.6 前台任意文件读取 | 代码审计
    wpa破解学习实践
    Natural Merge Sort(自然归并排序)
    [转]the service mysql57 failed the most recent status[/br]mysql57 was not found解决办法
    《Metasploit魔鬼训练营》第七章学习笔记
    Adobe阅读器漏洞(adobe_cooltype_sing)学习研究
    MS10_087漏洞学习研究
    第三方插件渗透攻击之KingView
    《Metasploit魔鬼训练营》虚拟环境搭建中网络配置的一些问题
    KingView 6.53漏洞学习研究
  • 原文地址:https://www.cnblogs.com/blueFlowers/p/4971925.html
Copyright © 2011-2022 走看看