A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© shihao1991 中级黑马   /  2016-11-24 23:39  /  792 人查看  /  0 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

IO概述:
    字节流
       字节输入流
       字节输出流
    字符流
       字符输入流
       字符输出流

2.字节流:
     1.向文件中写字节:FileOutputStream
          a.使用步骤:
            1.创建 FileOutputStream 流对象,关联文件路径
            2.利用write()方法向关联的文件中写入内容
            3.关流释放流对象占用的系统底层资源
          b.案例:
              FileOutputStream fos = new FileOutputStream("c:\\a.txt");//创建FileOutputStream流对象关联c:\\a.txt
                                                                       //如果指定的路径文件已经存在,清空文件内容
                                                                       //如果指定的路径不存在,创建新的空文件
                      
                      
              fos.write(97);//将97字节写入a.txt,但是a.txt,使用GBK码表(支持ASCII码表)
                            //显示的是a
            
              byte[] bytes = {65,66,67,68};
              fos.write(bytes);//批量字节的写入
                             
                          //写字节数组的一部分,开始索引,写几个
                          fos.write(bytes, 1, 2);//部分字节写入,66,67字节写入
                                   
                          fos.write("hello".getBytes());//将字符串按照平台默认码表(GBK)转换为字节写入
                                                       //a.txt在按照gbk码表查找出每个字节对应的字符

                     
                          fos.close();//关闭资源
    2.读取文件中的字节:FileInputStream
          a.使用步骤:
             1.创建FileInputStream 流对象,关联文件的路径
             2.利用read()方法从流关联的文件中读取内容(文件必须存在,否则报错)
             3.关流释放流对象占用的系统底层资源
          b.案例:
            FileInputStream fis = new FileInputStream("c:\\a.txt");
               
            byte[] b = new byte[1024];//定义一个缓冲区(字节数组),我们一般开辟1024的整数倍
               
            int len = 0 ;
            while( (len = fis.read(b)) !=-1){//从a.txt中读取尽可能多的字节(读取的字节数<=1024),装到b的字节数组中,返回当前读到的有效字节个数
                  System.out.print(new String(b,0,len));//将b字节数组中从0索引开始,len个字节按照平台默认的码表转换为字符串
            }
            fis.close();

3.字符流:
   a.码表概念:
        ASCII码表:占用一个字节,第一位为0,用的后七位(0xxx xxxxx)表示单个字符:'a','b'...
        Unicode码表:囊括了各国的字符,每个字符都使用两个字节表示
        UTF-8码表:囊括了各国的字符,但是为了节省空间(ASCII码用1个字节表示,文字用2个或2个字节以上表示)
                  UTF-8使用变长字节表示字符,范围1~4个字节
        ISO8859-1:占用一个字节,第一位为1,用的后七位(1xxx xxxx)表示拉丁字符
                  没有中文字符的对照关系
        gb2312:所有的字符占用两个字节,该码表表示的是中文与字节的对应关系
        gbk:所有的字符占用两个字节,该码表表示的是中文与字节的对应关系,gbk表示的中文更多,gb2312的增强版
        
        编码:将文字转为数字  "a".getBytes()=>{97}
        解码:将数字转为文字  new String({97,98,99})=>"abc"

       注意:以上所有的码表都包含ASCII码表   
   
   b.向文本文件中写字符:FileWriter
        FileWriter fw = new FileWriter("c:\\1.txt");
        
        //写1个字符
        fw.write(100);
        fw.flush();//为什么需要flush()?=>FileWriter底层使用了Writer类的缓冲区(长度为1024的字符数组)
                   //fw.Write(100)对应的将'd'字符写入到字符数组中,在调用flush()将
                  //字符数组中的内容刷新FileWriter关联的1.txt中
                 //只要将数据写到缓冲区中就需要刷新,将缓冲区中的内容刷新到流关联的文件中
        
        //写1个字符数组
        char[] c = {'a','b','c','d','e'};
        fw.write(c);
        fw.flush();
        
        //写字符数组一部分
        fw.write(c, 2, 2);
        fw.flush();
        
        //写如字符串
        fw.write("hello");
        fw.flush();
        
        fw.close();
   c.读取文本文件中的内容:FileReader
            FileReader fr = new FileReader("c:\\1.txt");
            char[] ch = new char[1024];
            int len = 0 ;
            while((len = fr.read(ch))!=-1){//从c:\\1.txt读取尽可能多的字符到ch中,返回的是当前读到的字符的个数
              System.out.print(new String(ch,0,len));//将ch中从0索引开始len个字符转换为字符串
            }
            
            fr.close();
   d.flush()方法与close()方法
     flush()方法:如果数据写到缓冲区中,需要调用flush()方法将数据刷新到文件中
     close()方法:底层会先刷新在关流释放流占用的底层系统资源



4.字节流与字符流的拷贝文件:
    1.字节流拷贝:适用于所有的文件(文本文件,音频,视频,多媒体,因为所有的文件在计算机中都是以字节存储)
         a.单字节拷贝:
                /*单字节拷贝的标准IO异常处理格式*/
                FileInputStream fis = null;
                FileOutputStream fos = null;
                try{
                  //建立两个流的对象,绑定数据源和数据目的
                  fis = new FileInputStream("c:\\t.zip");
                  fos = new FileOutputStream("d:\\t.zip");
                 
                  int len = 0 ;
                  while((len = fis.read())!=-1){
                    fos.write(len); //字节输入流,读取1个字节,输出流写1个字节
                  }
                }catch(IOException ex){
                  System.out.println(ex);
                  throw new RuntimeException("文件复制失败");
                }finally{
                  try{//这个try检测的fos.close()
                    if(fos!=null)//如果上面new FileOutputStream("d:\\t.zip");抛出异常
                                 //fos为null,fos.close()会报NullPointerException
                                 //所以说:为了防止NullPointerException
                      fos.close();
                  }catch(IOException ex){
                    throw new RuntimeException("释放资源失败");
                  }finally{//目的:防止fos关闭出现异常,fis无法关闭
                    try{//这个try...catch检测和处理fis.close()
                      if(fis!=null)
                        fis.close();
                    }catch(IOException ex){
                      throw new RuntimeException("释放资源失败");
                    }
                  }
                }
              }
         b.多字节拷贝(提高效率):
            FileInputStream fis = null;
                FileOutputStream fos = null;
                try{
                  fis = new FileInputStream("c:\\t.zip");
                  fos = new FileOutputStream("d:\\t.zip");
                  //定义字节数组,缓冲
                  byte[] bytes = new byte[1024*10];
                  //读取数组,写入数组
                  int len = 0 ;
                  while((len = fis.read(bytes))!=-1){//从t.zip中尽可能读取字节到bytes字节数组中(读取的字节数<=1024*10),返回当前读到的有效字节个数

                    fos.write(bytes, 0, len);//将bytes数组从0索引开始,len个字节写入到fos关联的d:\\t.zip中
                  }
                }catch(IOException ex){
                  System.out.println(ex);
                  throw new RuntimeException("文件复制失败");
                }finally{
                  try{
                    if(fos!=null)
                      fos.close();
                  }catch(IOException ex){
                    throw new RuntimeException("释放资源失败");
                  }finally{
                    try{
                      if(fis!=null)
                        fis.close();
                    }catch(IOException ex){
                      throw new RuntimeException("释放资源失败");
                    }
                  }
                }
     
     2.字符流拷贝(只能操作文本文件)
            FileReader fr = null;
            FileWriter fw = null;
            try{
              fr = new FileReader("c:\\1.txt");
              fw = new FileWriter("d:\\1.txt");
              char[] cbuf = new char[1024];//开辟长度为1024整数倍的字符数组
              int len = 0 ;
              while(( len = fr.read(cbuf))!=-1){
                fw.write(cbuf, 0, len);
                fw.flush();
              }
              
            }catch(IOException ex){
              System.out.println(ex);
              throw new RuntimeException("复制失败");
            }finally{
              try{
                if(fw!=null)
                  fw.close();
              }catch(IOException ex){
                throw new RuntimeException("释放资源失败");
              }finally{
                try{
                  if(fr!=null)
                    fr.close();
                }catch(IOException ex){
                  throw new RuntimeException("释放资源失败");
                }
              }
            }
          }

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马