Java学习笔记33——特殊操作流

特殊操作流

  • 特殊操作流
    • 标准输入输出流
    • 打印流
      • 字节打印流
      • 字符打印流
        • 用字符打印流改进复制Java文件
    • 对象序列化流
      • 对象序列化流
      • 对象反序列化流
      • 对象序列化流的三个问题
    • Properties
      • Properties作为Map集合的使用
      • Properties作为集合的特有方法
      • Properties和IO流结合的方法

特殊操作流

标准输入输出流

System类中有;两个静态的成员变量

  • public static final InputStream in:标准输入流。通常该流对应于键盘输入或者主机环境或者用户指定的一个另一个输入源
  • public static final PrintStream out:标准输出流。通常该流对应于显示输出或由主机环境或用户指定的另一个输出目标。

打印流

只负责输出数据,不负责读数据

字节打印流

PrintStream
使用继承父类的write写数据,查看时会自动转码,使用特有方法(print和println)则不会

字符打印流

PrintWriter

方法名 说明
PrintWriter(String fileName) 使用指定的文件名创建一个新的PrintWriter,而不会自动执行刷新
PrintWriter(Writer out, boolean autoFlush) 创建一个新的PrintWriter
out:字符输出流
autoFlush:一个布尔值,为真则print、println或format方法将自动刷新缓冲区

用字符打印流改进复制Java文件

public class PrintStreamDemo {
    public static void main(String[] args) throws IOException {
        /*
        BufferedReader br=new BufferedReader(new FileReader("test.java"));
        BufferedWriter bw=new BufferedWriter(new FileWriter("copy05.java"));
        String line;
        while((line=br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        br.close();
        bw.close();
        */
        //打印流只能写不能读
        BufferedReader br=new BufferedReader(new FileReader("test.java"));
        PrintWriter pw=new PrintWriter(new FileWriter("copy06.java"),true);
        String line;
        while((line=br.readLine())!=null){
            pw.println(line);
        }
        br.close();
        pw.close();

    }
}

对象序列化流

对象序列化:指的是将对象保存到磁盘中,或者在网络中传输对象。这种机制就是使用一个字节序列表示一个对象,该字节序列包括:对象的类型、对象的数据和对象中存储的属性等信息字节序列写到文件后,相当于在文件中持久保存一个对象的信息。
该字节序列还可以从文件中读取回来,重构对象,进行反序列化

对象序列化流

ObjectOutputStream
将Java对象的原始数据类型和图形写入OutputStream。可以使用ObjectInputStream读取(重构)对象。可以通过使用流的文件来实现对象的持久存储。如果流是网络套接字流,则可以在另一个主机或者进程中重构对象

  • 构造方法
    ObjectOutputStream(Outputstream out):创建一个写入指定的OutputStream的ObjectOutputStream

  • 序列化对象的方法
    void writeObject(Object obj):将指定的对象写入ObjectOutputStream

对象序列化

public class ObjectOutputStreamDemo  {
    public static void main(String[] args) throws IOException{
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("src\\com\\itheima02\\oos.txt"));
        //创建对象
        Student s=new Student("杨天伦",24);
        /*
            需要实现Serializable接口不然无法序列化和反序列化
            标识接口不需要重写方法
         */
        //写入文件
        oos.writeObject(s);
        oos.close();
    }

}

注意!!!

  • —个对象要想被序列化,该对象所属的类必须必须实现Serializable接口
  • Serializable是个标记接口,实现该接口,不需要重写任何方法

对象反序列化流

ObjectInputStream

  • ObjectInputStream反序列化先前使用ObjectOutputStream编写的原始数居和对象

  • 构造方法
    ObjectInputStream(InputStream in):创建从指定的InputStream读取的ObjectlnputStream

  • 反序列化方法
    Object readObject(): 从ObjectlnputStream读取一个对象

public class ObjectInputStreamDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src\\com\\itheima02\\oos.txt"));
        Object obj = ois.readObject();
        Student s = (Student) obj;
        System.out.println(s.getName()+","+s.getAge());
        ois.close();
    }

}

对象序列化流的三个问题

  1. 用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会不会出问题呢?
    会出问题。抛出 InvalidClassException
  2. 如果出问题了,如何解决呢?
    显式声明序列化id值,对象所属的类加 private static final long serialVersionUID
  3. 如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?
    给成员变量加上关键字 transicent
    transicent修饰的关键字不参与序列化。会赋上默认值。

Properties

Properties作为Map集合的使用

public class PropertiesDemo {
    public static void main(String[] args){
        Properties prop=new Properties();
        prop.put("001","杨天伦");//没泛型,默认是Object类型的
        prop.put("002","李昊");
        prop.put("003","朱长坤");
        Set<Object> keySet=prop.keySet();
        for (Object key:keySet) {
            Object value = prop.get(key);
            System.out.println(key+","+value);
        }
    }
}

Properties作为集合的特有方法

方法名 说明
Object setProperty(String key,String value) 设置集合的键和值,都是String类型,底层调用Hashtable方法put
String getPorperty(String key) 使用此属性列表中的指定的键搜索属性
Set stringPorpertyNames() 从该属性列表返回一个不可修改的键集,其中键及其对应的值都是字符串
public class PropertiesDemo {
    public static void main(String[] args){
        Properties prop=new Properties();
        prop.setProperty("001","杨天伦");
        prop.setProperty("002","李昊");
        prop.setProperty("003","朱长坤");
        System.out.println(prop.getProperty("0011"));
        System.out.println(prop);
        Set<String> names=prop.stringPropertyNames();
        System.out.println(names);
        for (String key:names) {
            System.out.println(prop.getProperty(key));
        }
        
    }
}

Properties和IO流结合的方法

方法名 说明
void load(InputStream inStream) 从输入字节流读取属性列表(键和元素对)
void load(Reader reader)
void store(OutputStream out, String comments) 将此属性列表(键和元素对)写入此Properties表中,以适合于使用load(lnputStream)方法的格式写入输出字节流
void store(Writer writer,String comments) 将此属性列表(键和元素对)写入此 Properties表中,以适:使用load(Reader)方法的格式写入输出字符流
public class PropertiesDemo {
    public static void main(String[] args) throws IOException {

        myStore();
        myLoad();
    }

    private static void myLoad() throws IOException {
        Properties prop=new Properties();
        FileReader fr=new FileReader("src\\com\\itheima02\\fw.txt");
        prop.load(fr);
        fr.close();
        System.out.println(prop);
    }

    public static void myStore() throws IOException {
        Properties prop=new Properties();
        prop.setProperty("001","杨天伦");
        prop.setProperty("002","李昊");
        prop.setProperty("003","朱长坤");

        FileWriter fw=new FileWriter("src\\com\\itheima02\\fw.txt");
        prop.store(fw,null);
        fw.close();
    }
}

你可能感兴趣的:(从零开始Java学习,java,学习,笔记)