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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁錦泰 黑马帝   /  2012-5-6 13:14  /  1969 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 袁錦泰 于 2012-5-6 13:16 编辑

對於幾種流的選擇和操作,概念并不是很明瞭,例如源和目的的確定等等,哪位仁兄可以為我講解一下IO流的操作規律,謝謝!


3 个回复

倒序浏览

字节流 用来操作二进制数据如图片 声音等等  如果用字符流操作的话会出现乱码或者损坏
字符流 用来操作文本字符串 也可以用字节流操作 字符流是字节流数度的2倍
缓冲流 用来把提高字节或字符流效率的方法封装到了缓冲流中简化流操作 这些流都是基于低层流实现IO操作的 所以不加一样可以达到效果  原理 流中用个数组作为缓冲存储要输入或输出的数据 当数组缓冲大于或等于你指定的大小时或关闭流时把数组缓冲里的数据一次写到底层流中如果没有指定缓冲大小用默认值1024*8作为数组长度  没加缓冲流也不一定比加了缓冲流的流慢也可以比它块

输入流 从源(初始化输入流时指定的对象 如文件、键盘等)流向目的地(输入流(内存))
输出流 从源(输出流(内存))流向目的地(初始化输出流时指定的对象(文件或屏幕等等))

操作规律  先定义初始化流 然后操作流  关闭流  输出流关闭之前默认先刷新流
  1. public static void main(String[] args) throws FileNotFoundException {
  2.                 //定义流
  3.                 FileInputStream fi=null;
  4.                 FileOutputStream fo=null;
  5.                 try {
  6.                         //初始化流
  7.                         fi = new FileInputStream("E:/JAVA/ShiPing/基础/黑马程序员" +
  8.                                         "_毕向东_Java基础视频教程第19天-06-IO流(装饰设计模式)/黑马程序员_" +
  9.                                         "毕向东_Java基础视频教程第19天-06-IO流(装饰设计模式).avi");
  10.                         fo=new FileOutputStream("c:/1/黑马程序员_毕向东_Java基础" +
  11.                         "视频教程第19天-06-IO流(装饰设计模式).avi");
  12.                        
  13.                         //操作流
  14.                         byte[] buff=new byte[1024*8];
  15.                         for(int line;(line=fi.read(buff))!=-1;){
  16.                                 fo.write(buff,0,line);
  17.                                 fo.flush();
  18.                         }
  19.                 } catch (FileNotFoundException e) {
  20.                         throw new FileNotFoundException("流初始化错误");
  21.                 } catch (IOException e) {
  22.                         throw new RuntimeException("IO操作错误");
  23.                 }finally{
  24.                         //关闭流
  25.                         try {
  26.                                 if(fi!=null){
  27.                                         fi.close();
  28.                                 }
  29.                         } catch (IOException e) {
  30.                                         throw new RuntimeException("输入流关闭错误");
  31.                         }finally{
  32.                                 if(fo!=null){
  33.                                         try {
  34.                                                 fo.close();
  35.                                         } catch (IOException e) {
  36.                                                 throw new RuntimeException("输出流关闭错误");
  37.                                         }
  38.                                 }
  39.                         }
  40.                                
  41.                        
  42.                 }
  43.                
  44.         }
复制代码
回复 使用道具 举报
学习流先从总体上掌握:
流的框架以4大抽象类为核心(如图)
其它的流都是在这4种类上的扩展!
注意:字符流只能处理文本信息(txt、word)(如:FileReader )
           字节流功能比字符流强大:可以处理任何信息(音乐、图片、电影……)(如:FileInputStream )

字节流处理数据以字节为单位,字符流处理数据以字符为单位,显然这样的效率很低,所以产生了包裹流

包裹流(如:
BufferedInputStream、BufferedReader、
DataInputStream:能向流中写入基本数据类型的二进制数据
InputStreamReader:将字节流转换成字符流
ObjectInputStream:把对象直接写入或读出

掌握几个主要的就足够了!

另外,java.nio.channels.FileChannel这个类读写数据的效率相当惊人,是sun专为写异步程序设计的!

2012-05-06_142636.png (9.55 KB, 下载次数: 29)

2012-05-06_142636.png
回复 使用道具 举报
本帖最后由 nailsoul 于 2012-5-6 14:49 编辑

一次性读写完

//操作流
                   int line=fi.available();

14.               byte[] buff=new byte[line];

15.               line=fi.read(buff);

16.               fo.write(buff,0,line);

                    fo.close();
                    fi.close();
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马