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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗衎 黑马帝   /  2011-7-27 00:16  /  2737 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有没谁系统的总结一下IO的东西!!!
看视频看的我晕头了 ,没有一个主线牵引着
求学这章的思路
思路决定出路  

非常感谢

评分

参与人数 1技术分 +1 收起 理由
admin + 1 不懂就问!

查看全部评分

3 个回复

倒序浏览
黑马网友  发表于 2011-7-27 01:28:00
沙发

io总结

--io概述
简单的说,就是提供了一系列对介质进行读写操作功能的类
--io流的分类
*按方向:分为输入流和输出流
*按单位:分为字节流和字符流
*按功能:分为节点流和处理流--实际上处理流的实现就是使用装饰设计模式(Decorator),和适配器设计模式(Adapter)而已
--io包中最顶层抽象类
*InputStrem--读取字节
*OutputStream--写入字节
*Reader--读取字符
*Writer--写入字符
*在字节流中使用byte[] buffer作为中间数据,字符流中使用char[] buffer作为中间数据,这样能避免频繁的和硬盘操作
--节点流和处理流
   节点流,是直接接到一个介质的流类型
   处理流,不是直接接到一个介质,而是接到一种节点流或者是一个处理流来增强处理功能
   所以,首先有节点流再有处理流
   
--常用的节点流
父 类    InputStream                      OutputStream                      Reader                   Writer

文 件   *FileInputStream                FileOutputStrean                  FileReader               FileWriter           -----对文件进行处理的节点流
数 组   *ByteArrayInputStream      ByteArrayOutputStream      CharArrayReader    CharArrayWriter -----对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)
                      *比如ByteArrayOutputStream baos=new ByteArrayOutputStream();
                      *然后往里面写东西;
                      *最后使用baos.toByteArray();方法返回字节数据
                      或者
                      *ByteArrayInputStream bais=new ByteArrayInputStream(一个存在的byteArray,或者baos.toByteArray())
                      *然后就可以读取数组里面的内容了
字符串   *无                无       StringReader  StringWriter       -----对字符串进行处理的节点流
管 道   *PipedInputStream            PipedOutputStream  PipedReader  PipedWriter       -----对管道进行处理的节点流


--常用处理流(关闭处理流使用关闭里面的节点流)
父 类     InputStream                     OutputStream                       Reader                               Writer
缓冲流    *BufferedImputStrean  BufferedOutputStream         BufferedReader                BufferedWriter    -----需要父类作为参数构造,增加缓冲功能,避免频繁读写硬盘,可以初始化缓冲数据的大小,由于带了缓冲功能,所以就写数据的时候需要使用flush方法咯
转换流    *                                                                       InputStreamReader          OutputStreamWriter-需要inputStream或OutputStream作为参数,实现从字节流到字符流的转换
数据流    *DataInputStream            DataOutputStream                                                                                            -提供将基础数据类型写入到文件中,或者读取出来,为什么要有这个流呢?看这样的分析,
                       *如果没有这种流的话,有一个long,本身只占8个字节,如果我要写入到文件,需要转成字符串,然后在转成字符数组,那空间会占用很多
                       *但是有了这种流之后就很方便了,直接将这8个字节写到文件就完了。。是不是既节约了内存空间有让程序写起来更加方便简单了呐
                       *写倒是很简单,但是读取的时候就注意了,根据读取的数据类型,指针会往下移,所以你写的顺序必须要和读的顺序一致才能完成你正确的需求
       *ObjectInputStream          ObjectOutputStream
       *顺便研究序列化---将对象所在的类型全部转换成二进制,然后写入到介质中去
       *transient关键字--修饰成员变量,不写入该成员变量
       *Serializable接口--表示接口,怎样实现的呢,在序列化之前,首先判断  (对象 instanceof Serializable)如果返回true则执行序列化,否者抛出异常,并且里面有一个ID,是用来快速查找某个对象的时候使用的
       *Externalizable接口--外部化接口;他是Serializable接口的子接口,能手动控制序列化的方式
       为什么要用writeUTF()--因为这种方式是按照utf-8来写入的,而默认方式是utf-16只是节省空间而已


--字节流读取中文的问题
*由于java使用的是unicode编码,每一个中文字符是占用两个字节的,所以没有只读出其中一个字节并使用的话当然是乱码咯,
*虽然普通的英文字符也是两个字节的,但是读取的时候将高8位去掉也能回去正确的英文字符,所以没有问题
*所以最好还是使用字符流的方式读取好点

--java.io中专门提供用于打印的流(这类流在写入的时候有自动flush的功能,所以你不需要没打印一个东西都flush一次)--------注意他们也是属于处理流,只不过这里单独列出来分析而已
*PrintStream--继承自-->FilterOutputStream--继承自-->OutputStream,(它的构造函数需要OutputStream对象)
*PrintWriter---继承自-->Writer(它的构造函数需要Writer对象)
System.In====InputStream
System.Out===PrintStream
这种流的print方法不会抛出异常,这是JSP技术中常用的流,如果在JSP页面的打印会抛出异常的话,那JSP也太难写了点!注意理解这样的设计思路

--看这样的代码
PrintStream ps=new PrintStream(new OutputStream("c://..."));
System.setOut(ps);
System.Out.println("jfdajsflkajdf");//这样将不会在打印到命令行窗口,而是指定的PrintStream目标文件里面去

评分

参与人数 1技术分 +3 收起 理由
admin + 3 很全面,辛苦了!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-27 08:56:39
藤椅
简单的来说就是一根管道接在文件上,文件一点一滴的流出来,外边管道一层套一层,如果有缓冲的话,就相当于加了个小桶接一点一滴的文件流。类比一下这个好了
回复 使用道具 举报
不行就去买一本 张孝祥老师的 JAVA 就业培训教程   清华出版社的    视频跟书是配套的  你一边看书一边看视频容易理解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马