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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

qiuyou

初级黑马

  • 黑马币:21

  • 帖子:15

  • 精华:0

© qiuyou 初级黑马   /  2016-9-18 18:43  /  442 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//io流总结:
io流分为字节流和字符流,其中字节流的顶层是InputStream和OutputStream,字符流的顶层是Reader,Writer,InputStream,
OutputStream是抽象类,不能new,Reader,Writer也是抽象类,InputStream下面比较常用的子类对象是FileInputStream,操作文件的
输入流,OutputStream下面比较常用的子类对象是FileOutputStream,操作文件的输出流,包装类有BufferedInputStream,BufferedOutputStream
,Reader下面的子类中比较常用的是FileReader,Writer下面的子类中比较常用的是FileWriter,这两个管道可以直接捅到文件上去,
字节流转字符流的桥梁是InputStreamReader,字符流转字节流的桥梁是OutputStreamWriter,这两个都是字符流,
下面讲一讲字节流的读写操作,例如如下:
        //第一种方式,一个字节一个字节的读取,再一个字节一个字节的写出去
        FileInputStream fis = new FileInputStream("a.txt");
        FileOutPutStream fos = new FileOutPutStream("b.txt");
        int a;  
        while((a=fis.read())!=-1){
           fos.write(a);
        }
        fis.close();
        fos.close();
         //第二种方式,读取到一个数组里去,再把数组里的字节写出去,因为都是在内存完成,这种方式会比第一种效率更加高一点
        FileInputStream fis = new FileInputStream("a.txt");
        FileOutPutStream fos = new FileOutPutStream("b.txt");
        //定义一个字节数组
        byte arr = new byte[8192];//为什么是8192?从源码知道的
        int len;   //这是每一次实际读取到的个数,注意是个数
        while((len=fis.read(arr))!=-1){
           fos.write(arr,o,len);  //把数组里的内容写出去,从0开始到实际读取到的len个
        }
        fis.close();
        fos.close();
      注意事项:01,这里要理解是怎样读取到数组里去的,如果最后剩下几个字节,比数组容量小是怎样的情况,
      这几个字节会把前一段装满的数组字节替换出来几个,所以我们写的时候就要要求写出去实际的个数。
      02:第一种方法java设计者为什么要用一个int类型的变量来接呢?因为我们读取字节的时候判断读取到末尾是-1,如果文本
      中间是一个-1的数字怎么办?难道我们就结束读取了吗?为了避免在中间读取到-1就结束读取工作,所以在设计的时候,就用
      了int。

下面讲一讲字符流的读写:
      //第一种方式,一个字符一个字符的读取,再一个字符一个字符的写出去
        FileReader filereader = new FileReader("a.txt");
        FileWiter  filewriter = new FileWriter("b.txt");
        int a ;//一个字符一个字符的读取,中文是两个字节,第一个字节是负数,读取的时候见到负数连续读两个字节
        while((a=filereader.read())!=-1){
          filewriter.writer(a);
        }
      //第二种方式,读取到一个字符数组里面去,再把字符数组写出去,类似上面的字节流
        FileReader filereader = new FileReader("a.txt");
        FileWiter  filewriter = new FileWriter("b.txt");
        //定义一个字符数组
        char[] arr = new char[8192];
        int len;
        while((len=filereader.read(arr))!=-1){
            filewriter.write(arr,0,len);
        }
        filereader.close();
        filewriter.close();

//下面讲一讲更加高效率的字节流读取,BufferedInputStream有8192个单位的缓冲,这是更加高效率的字节流读取方式的第一种
     BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
     BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.txt"));
     int a ;//从缓冲区里一个一个的读取
     while((a=bis.read())!=-1){
        bos.write(a);  //读取一个字节写出一个字节
     }
     bis.close();
     bos.close();
   //这是更加高效率的字节流读取方式的第二种
     BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
     BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.txt"));
     //定义一个字节数组
     byte[] arr = new byte[1024];//这里是建议这么大的
     int len; //每一次实际读取到的个数
     while((len=bis.read(arr))!=-1){
       bos.write(arr,0,len);
     }
     bis.close();
     bos.close();

//下面讲一讲更加高效的字符流的读写操作,这是第一种
    BufferedReader bfd = new BufferedReader(new FileReader("a.txt"));
    BufferedWriter bfw = new BufferedWriter(new FileWriter("b.txt"));
    int a;//一次从缓冲区读取一个字符
    while((a=bfd.read())!=-1){
     bfw.write(a);
    }
    bfd.close();
    bfw.close();
    //更加高效的字符流的读写操作,这是第二种
    BufferedReader bfd = new BufferedReader(new FileReader("a.txt"));
    BufferedWriter bfw = new BufferedWriter(new FileWriter("b.txt"));
    //定义一个字符数组
    byte[] arr = new byte[1024];
    int len;//实际读取到的字符个数
    while((len=bfd.read(arr))!=-1){
      bfw.write(arr,0,len);//写到缓冲区,缓冲区一满就刷到文件上去,缓冲区的默认大小是8192个单位
    }
    bfd.close();
    bfw.close();


//下面演示字节流转字符流,和字符流转字节流的用法
   BufferedReader bfd = new BufferedReader(new InputStreamReader(new FileInputStream("a.txt")));  //字节流转字符流
   BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt")));//字符流转字节流
   //也是和更加高效的字符流的读写操作一样有两种读写操作,这里只用第二种
    //定义一个字符数组
    byte[] arr = new byte[1024];
    int len;//实际读取到的字符个数
    while((len=bfd.read(arr))!=-1){
      bfw.write(arr,0,len);//写到缓冲区,缓冲区一满就刷到文件上去,缓冲区的默认大小是8192个单位
    }
    bfd.close();
    bfw.close();
   
一些其他的流的用法:

0 个回复

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