黑马程序员_其他流对象 集合IO复习


------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------


1. 打印流
 |-- 特点:只操作数据目的,不操作数据源,将数据打印向目的地
           永远不会抛出IO异常


 |-- PrintStream
    |-- 操作File对象
    |-- 字节输出流
    |-- 字符串形式文件名


 |-- PrintWriter
    |-- 操作File对象
    |-- 字节输出流
    |-- 字符串形式文件名
    |-- 字符输出流


    |-- 启动打印流的自动刷新功能,必须要实现println printf format
    |-- 只要是向目的地中输入数据,推荐使用打印流




2. 对象的序列化,对象的反序列化***** 面试
  |-- 将对象中的数据,永久性保存到本地文件中,以后使用直接读取该文件
  |-- 将对象中的数据写到文件中,对象的序列化
  |-- 从文件中读取对象中的数据,反序列化
    |-- ObjectOutputStream
       |-- 构造方法传递字节输出流,字节输出流中绑定一个文件,对象写入的文件
       |-- writeObject()方法,写入对象
    |-- ObjectInputStream
       |-- Object readObject()




3. 对象实现Serializable接口
  |-- 需要序列化的对象,必须实现Serializable接口,开启对象的序列化功能
  |-- 静态不能序列化
  |-- 没有方法的接口,属于标记型接口,相当于给类,打了一个标记


  |-- 序列化一个对象的时候,JVM会在class文件中,定义一个序列号,进行了序列号
     修改了java文件后,JVM会从新在class文件中,在定义个序列号,将原来的序列号覆盖了
     没有再次进行序列化,直接读取了这个序列化文件,造成了2次的序列号不匹配问题


  |-- 当我们修改源文件后,不影响对象的正常使用,此时没有必要从新序列化,
      手动编写序列号,JVM将不会自定定义序列号了,class文件中的序列号就固定不变了


Exception in thread "main" java.io.InvalidClassException: cn.itcast.otherio.Person; 
local class incompatible: stream classdesc serialVersionUID = 4584748870795484716, 
local class serialVersionUID = 7489917474242444858
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:604)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1601)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1514)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
at cn.itcast.otherio.ObjectWriterReaderDemo.reader(ObjectWriterReaderDemo.java:24)
at cn.itcast.otherio.ObjectWriterReaderDemo.main(ObjectWriterReaderDemo.java:9)


4. 管道流
  |-- 管道输出流
  |-- 管道输入流
  |-- 特点:没有输入的时候,输出等着,有了数据了,就会读取这个数据
  |-- 配合多线程使用
  |-- connect()方法,连接管道输入流,管道输出流




5. 转换流的编码效果




6. 编码表
  |-- ASCII  美国标准信息交换码 符号,数字,英文字母
  |-- GB2312 中国汉字的码表  4000个汉字
  |-- GBK    20000个汉字  
  |-- iso8859-1 拉丁文  Web服务器Tomcat,默认码表iso
  |-- Unicode 码表,集合了当今世界的全部语言
  |-- utf-8 码表


  |-- 字符串--》编码表  字符编码
  |-- 编码表--》字符串  字符解码


  |-- 文字被IOS8859-1的码表所解码,乱码
     采用编一次,在解一次,才能还原成中文
     new String("乱码".getBytes("utf-8"),"gbk");




=================================================================


集合,专门存储对象,知道如何存储,知道怎么取出


 Collection 单列集合
   |-- add()存储对象
   |-- size()集合中的对象个数
       |-- List 索引,有序,可以重复
          |-- ArrayList 数组结构,查询块,线程不安全
 |-- LinkedList 链表,增删块,线程不安全
          |-- Vector 数组结构,查询块,线程安全


       |-- Set 无索引,无序,不重复
          |-- HashSet 哈希表,对象唯一,对象覆盖hashCode 和 equals  线程不安全
 |-- TreeSet 二叉树,对象自然排序,对象实现Comparable接口  线程不安全
     TreeSet 自身具备比较性,定义类实现Comparator接口
    
   |-- 集合中存储对象的取出方式
     |-- 迭代器: Iterator it = 集合.iterator();while(it.hasNext()){ it.next()}
     |-- List集合,使用for循环的形式,遍历。List集合get(索引)
     |-- 增强for循环 (数据类型 变量 : 集合或者数组){}
     |-- 迭代的过程中,不能用集合的方法,操作集合,出现并发修改异常


   |-- 泛型:安全机制,让集合存储数据类型保证唯一
   |-- 强制集合存储一种类型
   |-- 将错误由运行时期,提前到了编译时期
   |-- 避免了类型的强制转换
      格式 集合<数据类型>  变量  = new 集合<数据类型>();


 Map 双列集合
   |-- put(键,值)
   |-- get(键)
   |-- keySet()键存储到Set集合
   |-- entrySet()返回键值关系对象Map.Entry,存储到Set集合
   |-- Map集合的取出方式 共2个,必须要会写


   |-- HashMap:底层也是哈希表,不允许重复键,自定义对象覆盖 hashcode 和 equals
   |-- TreeMap: 底层是红黑树,不允许重复键,存储到这个集合的键要具备比较性
       具体的实现形式,参考TreeSet 
   |-- Hashtable : 线程安全,不允许重复键,不存储null值和null键
      |-- Properties,键值的数据类型固定为String,双列集合,线程安全
         |-- getProperty(键) 根据键获取值
         |-- setProperty(键,值)向集合中存储键值,底层调用的就是put方法
|-- load(字符输入流或者字节输入流),将集合和IO管理起来使用
|-- store(字符输出流字节输出流,字符串类型的注释),将集合中存储键值,写回配置文件




======================================================================================


IO中的流对象的总结
  FileWriter   字符输出流,写文本文件   默认查询GBK 构造方法,write flush close
  FileReader   字符输入流,读取文本文件 默认查询GBK 构造方法,read(字符数组) close


  FileInputStream  字节输入流,读取任意文件 构造方法,read(字节数组) close
  FileOutputStream 字节输出流,写任意文件  构造方法,write(字节数组) close


  BufferedReader 字符输入缓冲区,读取文本文件,提供读取一行的功能 构造方法 readLine close
  BufferedWriter 字符输出缓冲区,写一行的功能,写入到文本文件 构造方法 newLine close


  BufferedInputStream
  BufferedOutputStream 


  以上的这些流对象,需要掌握谁是输出,谁是输入,各自特点,会用流复制文件


  InputStreamReader  构造方法,传递的都是字节流,字符缓冲,提供读取一行
  OutputStreamWriter 构造方法,传递的都是字节流,字符缓冲,提供写一行


  都是字符流,字符流操作字节流,提供读写一行的特点


  PrintWriter,不操作源,只操作目的,不管源是什么,只看数据目的,将源中的数据写向目的地
               数据源可以是,字节,字符
      数据目的,可以是字节 字符
      提供println方法,方便打印数据,自动刷新机制


  File对象,路径,文件夹,文件看做是File对象
   |-- 构造3种重载
   |-- creatNewFile() 创建新文件
   |-- mkdirs()   创建多级目录
   |-- exists()   判断File封装的路径是否存在
   |-- getName()  获取File封装路径或者文件名
   |-- getParent()获取父路径
   |-- listFiles()获取File对象,封装路径下的全部文件和文件夹


   |-- 递归,使用方式,注意事项
   |-- 重点,File中的方法,和IO流,配合使用,复制单级目的


 
===========================================================================





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值