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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dd6434541 中级黑马   /  2016-5-9 21:57  /  305 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Day20
01IO流
1. IO按流向分为输入流和输出流
2. 按操作类型分为字符流(reader, writer)和字节流(stream)

3. 字节流的抽象父类:
        * InputStream
        * OutputStream
4. 字符流的抽象父类:(操作的是纯文本文件, 用记事本打开, 并且能看的懂得文件, 用word打开不都行)
        * Reader
        * Writer
5. * IO程序书写
    * 使用前,导入IO包中的类
    * 使用时,进行IO异常处理
    * 使用后,释放资源

6. 文件的结束标志是-1
02InputStream和outputstream
1. int   read()        // 每次向下读取一个字符, 文件的默认结尾是-1
2. read( ) 为什么每次读取一个字节, 返回值却是一个int类型的;
   read()读的是字节byte是二进制形式的, 当遇到11111111时会认为是遇到了-1, 结束读取,
   为了防止这种情况发生, 将byte前边补3个8位的0凑足4个字节, 变成int类型, 11111111就会变成255了
    保证整个数据被读完, 读到的-1就是int类型的-1

    int read(byte[] b);   将字节流读入一个指定大小的byte数组中, 返回值是 读入字节数组的字节数
   
      int available( )            //一次性获得写入文件中的所有字节数
   


构造方法  
1,FileOutputStream(File file) 创建对象的时候 如果没有个文件,会创建一个, 如果有的话, 会清空这个文件
2.FileOutputStream(File file, boolean append)      会向已经存在的文件里追加写入的内容 续写!!

3. void  write( int  i)            //每次写入一个字符, 这里的int在写入的时候, 系统会自动去掉前三个8位
4. void write(int i , boolean append)   //true的时候回向文件中追加添加元素
5.

获取文件大小的方法
    File类的Length( )方法   
    FileInputStream类的available()方法
            File的length()方法更好用, 不需要关流   
03拷贝图片
1. 定义输入流和输出流对象
    FileInputStream fis = new FileInputStream("G:\\a.jpg");
    FileOutputStream fos = new FileOutputStream("G:\\copy.jpg");

2. 挨个字节读写copy    (效率太低, 不推荐)
    int i;
    while((i = fis.read()) != -1){        //挨个字节读取写入内存
        fos.write(i);                              //挨个字节输出
    }
3. 关闭输入流,输出流!
    fis.close();
    fos.close();
      


方法二:
2.  当文件过大时, 有可能会造成内存溢出
    byte[] arr = new byte[fis.availiable()];        //创建一个和文件大小样的字节数组
    fis.read(arr);                            //将文件读出, 并缓冲到一个字节组数(内存)中
    fos.write(arr);                            //将字节数组中的内容读出写入到输出流


方法三: 标准格式
3. 定义一个小数组, 每次读取短数组大小的byte流
    byte[] b = new byte[1024 * 8];                    //字节数组的长度一般定义为1024的倍数
    int len;                                                    //len表示每次读取到的字节数
    while ((len = fis.read(b)) != -1){                 //当读取到的字节数等于-1时表示文件读完了
            fos.write(b, 0, len);             //write(byte[] b, offset, length) 表示每次输出从字节数组中偏移位置开始的byte长度的字节
    }
04BufferedInputStream  BufferedOutputStream
1. 构造方法: BufferedInputStream(InputStream inputstream)
    相当于把inputstream包装进buffer字节缓冲中(缓冲区在内存中), 一次性从硬盘中读取一个字节数组的长度到缓存去中, 比挨个字符读取速度更快

2. BufferedInputStream bis = new BufferedInoutStream(new FileInputStream("G:\\xxx.mp3"));
    BufferedOutputStream bos = new BufferedOutputStrean(new FileOutputStream("G:\\copy.mp2"));
    int i;
    while ((i = bis.read()) != -1){     //在缓存区流中存在一个byte[]数组, 8192大小, 每次从输入流中读取一个字节数组的长度, 表面是读1个, 但是一次读就是读8192个大小
        bos.write(i);         //再将bufferedInputStream中的字符挨个写入BufferedOutStream中, 操作发生在内存中,效率高
    }

3. 定义小数组和缓冲区哪个更快一点?
    如果小数组的长度和缓冲区长度相等时, 即都是8192(1024 * 8)时, 小数组要稍快一些,定义小数组操作的是一个数组, 而定义缓冲区操作的是两个数组,
小数组在内存中不涉及取和存的操作, 而buffer缓冲区 需要存取, 所以小数组略快一些
浪费了一定的时间
05flush和close的区别
1.flush有刷新功能, 刷新之后还可以继续往里写, 需要实时刷新的, 需要要flush()
2.close也有刷新功能, 刷新之后就不能再继续往里写了, 流就关闭了
07图片加密
    用的亦或思想 一个数亦或两次相同的数还是他本身
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("G:\\secrit.jpg"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("G:\\secrit2.jpg"));
        int i;
        while ((i = bis.read()) != -1){
            bos.write(i ^ 123);    //每一位都亦或一个数, 想要看到这个图片, 就将这个图片作为输入源在来一次
        }
        bis.close();
        bos.close();

评分

参与人数 1黑马币 +2 收起 理由
fengge169 + 2 赞一个!

查看全部评分

2 个回复

倒序浏览
点赞!!!!总结得不错哦
回复 使用道具 举报
手动点赞、!!谢谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马