Java基础第十八天--IO流2

来源:互联网 发布:docker中安装windows 编辑:程序博客网 时间:2024/05/06 01:20

基本的流和高效的流能操作的数据类型有限,如果我想操作不同类型的数据,
那么,它们是做不到的
这个时候,Java就提供了一类流对象:打印流
注意:打印流仅仅提供输出功能,没有对应的读取功能

字节打印流 PrintStream -- 在JavaWeb中有使用
System.out.println() --System.out 类.字段 --> 对象  对象.方法()

1. 字符打印流 PrintWriter -->父类 Writer

为什么要学习打印流呢?
 1)打印流可以输出任意类型的数据
 2)如果启动了自动刷新,在调用println()的时候会自动刷新
 3)可以直接对文件进行操作
  哪些流对象可以直接对文件进行操作呢?
  看构造方法,如果同时有构造参数File类型和String类型,
  那么一般是可以直接对文件进行操作
特有功能:
 println()方法--对比继承父类的write() 好处是:
 写入,换行,自动刷新(在构造方法中已开启自动刷新)三合一 pw.println();
 bw.write(s);
 bw.newLine();
 bw.flush();

2. 可变参数 -- 针对参数不确定的情况(形式参数...变量)
 注意: 这里的变量其本质是该形式参数类型的一个数组
   这里会把调用到的数据自动封装成一个数组
   如果一个方法中有可变参数,并且有多个形式参数,可变参数在后面
   
3. public PrintWriter printf(String format, Object...args)  format--格式字符串
 System.out.printf("%.2f",100.123); -->输出:100.12
 
4. public static<T> List<T> asList(T...a)  把数组转成集合
 注意:这里的数组应该是引用类型
       转换后的集合的长度是固定的,所以不能做增add删remove操作,可以做修改set操作
 Integer[] arr = {1,2,3};
 List<Integer> list = Arrays.asList(arr);
 
5. Properties集合类 -->父类 HashTable -->父类 Map 键值对
 是一个唯一的可以和IO流结合使用的集合类
 
 和集合关联的特有功能
 1)添加元素
  Object setProperty(String key, String value)
 2)获取元素
  String getProperty(String key)
  String getProperty(String key, String defaultValue)
  Set<String> stringPropertyNames()
  
 和IO流的结合使用
 1)把数据从集合写到文件  -->打印流
  void list(PrintStream out)
  void list(PrintWriter out)
  prop.list(new PrintWriter("out.txt")); //将prop集合中的内容复制到了out.txt文件中
 2)把数据从文件写到集合(文件格式要求是键值对的形式)
  void load(InputStream inStream)
  void load(Reader reader)
 3)把数据从集合中写到文本文件  --> 一般IO流
  void store(OutputStream out, String comments)
  void store(Writer writer, String comments)
  
 应用场景:游戏的进度保存和加载
 案例 : 读取copy.txt 修改后 保存
  Properties prop = new Properties();
  //加载
  prop.load(new FileReader("copy.txt"));
  //修改
  for(String s:prop.stringPropertyNames()){
   if(s.equals("lisi")){
    prop.setProperty("lisi", "40");
   }
  }
  //保存
  prop.store(new FileWriter("copy.txt"), null);
6. ObjectOutputStream -- 序列化流:把对象按照流一样的方式操作
  writeObject(Object obj)
 ObjectInputStream -- 反序列化流:把流数据还原成对象
  ReadObject()
 Serializable接口 -- 序列化接口  是一个标记接口,实现该接口进而启动其序列化功能
 String类已经实现了Serializable接口
 ArrayList类也实现了Serializable接口
 
 一个类被序列化后,会有一个标记值
 在生成的class文件中也会有这个标记值
 在把该类对象网文件中存储的时候,同时会记录这个标记值
 
 如果修改了这个类,可能会造成类中的标记值与文件的标记值不同报错
 
 假如我有办法知道这个标记值是怎么表示的,我写一个固定的值来做标记 就ok了
 private static final long serialVersionUID = .....

 

0 0