黑马程序员____基础加强____[IO流个人总结](三)

2014-11-24 02:45:39 · 作者: · 浏览: 2
bjectInputStream(new FileInputStream("obj.txt")).readObject() //从文件中读取对象 注:序列化操作的是堆中的对象,所以 static 成员不能被序列化 private 成员无法被序列化,使用 UID 标识可打破该限制 非静态成员加上 transient 修饰就不会被序列化 "管道流" PipedInputStream & PipedOutputStream 这两个类也是一起使用的 一般流的输入输出没有太大关联,而管道流输入输出可以直接进行连接, 必须相互连接后创建通信管道;要结合多线程使用,单线程可能会死锁。 示例: class Read implements Runnable{} //封装线程任务 class Write implements Runnable{} main //主函数调用 PipedInputStream in = new PipedInputStream(); PipedOutputStream out = new PipedOutputStream(in);//构造参数in,也可空参,然后in.connect(out)关联 new Thread(new Read(in)).start(); //创建线程 new Thread(new Write(out)).start(); 阻塞式方法,使用中要预防线程死锁 Object-->RandomAccessFile 随机读写文件 强大的随机读写功能 特性: 构造对象时指定读写权限, "r"只读,"rw"读写 seek(8*x)方法,通过指针从文件的某个位置开始读写 该类是IO包中成员,具备文件读写功能,内部封装了字节输入流和输出流 随机是因为在内部封装了一个byte[] 数组,通过指针对数组的元素进行操作, 同时可以通过getFilePointer获取指针位置,通过seek改变指针位置。 创建对象示例: new RandomAccessFile("File","rw") //能够对该文件读写操作 RandomAccessFile 类如果引入多线程技术,就可以实现 P2P 下载,大大提高效率 其它类似的类区分 RandomAccess util包中的标记接口,被 List 实现,用来表明其支持快速随机访问, 该类与 RandomAccessFile 无直接联系,另见该包中 Random 类 另 java.lang 包中 Math 类的 random() 方法也提供了随机功能"骰子" ---------------------------------------------- 其他基本数据流 DataInputStream & DataOutputStream 专门操作基本数据类型的流对象 构造时要包装字节流使用 如使用 writeInt(22)方法写入; 再使用 readInt()读取到的 数据类型为 int 而不是 byte ByteArrayInputStream & ByteArrayOutputStream 专门用于操作"字节"数组 数据源 为字节数组 CharArrayReader & CharArrayWriter 操作"字符"数组 StringReader & StringWriter 操作字符串 ----------------------------------------------- 字符编码的问题:乱码 如果编码时的码表与解码时的码表不一致,就会导致乱码的情况 转换流 具有指定码表的构造方法 示例: new InputStreamReader(new FileInputStream("gbk.txt") , "utf-8")//指定utf-8来解码 编码与解码的过程: String --编码--> byte[] --解码-->String "中间码"的问题: 客户端与服务器端的码表不一致,例如一个服务器端(iso8859-1)的网页在客户端(中文 GBK)打开时就可能会产生乱码, 所以要加上二次编码与解码的过程,将乱码按照 iso8859-1 码表编码成 byte,再将该数据按照 GBK 解码 要注意的是: 作为中间码,一定要保持数据的精度, 即一个字符占据的字节要少于"终端码", 如: 终端码为GBK时,就不能用utf-8 作为中间码,因为utf-8 部分字符会占据3个字节,gbk为2个 在二次编码的过程中会按照utf-8 码表添加一些字节进去,导致数据精度损失,还会造成乱码。 "为什么不能用字符流copy 图片" 字节流可以操作任何文件,因为其操作单位是数据存储的最基本类型 byte 字符流只能用于操作文本,操作的基本数据类型为字符 char,一个字符一般占据 2(1~3)个字节 字符流在底层使用了字节流,通过查询编码表(java默认为 unicode)获取到字符,如果码表中能查到这两个字节对应的字符 就会返回该 char, 如果没有对应的字符就返回 -1; 所以,如果字符流操作的是文本,该文件内的字节在码表中都能够找到,就不会发生丢失数据的问题 而如果字符流操作的是非文本文件,就不可能保证所有的字节都能在码表中找到对应的字符,而这些找不到字符的字节 随着返回的-1 就消失了,从而造成字节丢失,数据损坏

---------------------------------------- android培训、java培训、期待与您交流! ------------------------------------