美文网首页
Java学习Day18

Java学习Day18

作者: JayMeWangGL | 来源:发表于2019-09-27 11:03 被阅读0次

今日学习内容总结

  • 缓冲流
  • 转换流
  • 序列化
  • 打印流

缓冲流

缓冲流,也叫高效流,是对4个基本的FileXxx 流的增强,所以也是4个流,按照数据类型分类:

  • 字节缓冲流BufferedInputStreamBufferedOutputStream
  • 字符缓冲流BufferedReaderBufferedWriter

缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。

字节缓冲流

构造方法

  • public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。
  • public BufferedOutputStream(OutputStream out): 创建一个新的缓冲输出流。

BufferedOutputStream使用步骤

  1. 创建FileOutputStram对象,构造方法中要绑定要输出的目的地
  2. 创建BufferedOutputStream对象,构造方法中传输FileOutputStream对象,提高FileOutputStream对象效率
  3. 使用BufferedOutputStream对象中的方法write,把数据写入内部缓冲区中
  4. 使用BufferedOutputStream对象中的方法flush,把内部缓冲区的数据刷新到文件中
  5. 释放资源(会自动调用flush方法)
public static void main(String[] args) throws IOException {
        FileOutputStream fos =new FileOutputStream("d:\\z.txt",true);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        bos.write(97);
        bos.close();
    }

BufferedInputStream使用步骤

  1. 创建FileInputStream对象,构造方法中要绑定要读取的文件
  2. 创建BufferedInputStream对象,构造方法中传输FileInputStream对象,提高FileInputStream对象的读取效率
  3. 使用BufferedInputStream对象中的方法read,读取文件
  4. 释放资源(会自动调用flush方法)
public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("d:\\z.txt");
        BufferedInputStream bis =new BufferedInputStream(fis);
        int read=0;
        while((read=bis.read())!=-1){
            System.out.println(read);
        }
        bis.close();
    }

字符缓冲流

构造方法

  • public BufferedReader(Reader in) :创建一个 新的缓冲输入流。
  • public BufferedWriter(Writer out): 创建一个新的缓冲输出流。

特有方法

字符缓冲流的基本方法与普通字符流调用方式一致,不再阐述,我们来看它们具备的特有方法。

  • BufferedReader:public String readLine(): 读一行文字。
  • BufferedWriter:public void newLine(): 写一行行分隔符,由系统属性定义符号。

使用步骤与字节流类似

写入数据:

public static void main(String[] args) throws IOException {
        BufferedWriter Bw = new BufferedWriter(new FileWriter("d:\\y.txt"));
        for (int i = 0; i <10 ; i++) {
            Bw.write("TestBufferedWriter");
            Bw.newLine();
        }
        Bw.close();
    }

读取数据:

 public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("d:\\y.txt"));
        String line;
        while ((line=br.readLine())!= null){
            System.out.println(line);
        }
        br.close();
    }

转换流

字符编码和字符集

字符编码

编码:字符(能看懂的)--字节(看不懂的)

解码:字节(看不懂的)-->字符(能看懂的)

  • 字符编码Character Encoding : 就是一套自然语言的字符与二进制数之间的对应规则。

    编码表:生活中文字和计算机中二进制的对应规则

字符集

  • 字符集 Charset:也叫编码表。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。
    常见字符集有ASCII字符集、GBK字符集、Unicode字符集等。

OutputStreamWriter类

构造方法

  • (OutputStream in): 创建一个使用默认字符集的字符流。
  • OutputStreamWriter(OutputStream in, String charsetName): 创建一个指定字符集的字符流。

使用步骤:

  1. 创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称
  2. 使用OutputStreamWriter对象中的方法write,把字符转换为字节存储在缓冲区
  3. 使用OutputStreamWriter对象中的方法flush,把内部缓冲区的数据刷新到文件中
  4. 释放资源(会自动调用flush方法)
public static void main(String[] args) throws IOException {
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\GBK.txt"),"GBK");
        osw.write("你好");
        osw.close();
    }

InputStreamReader类

构造方法

  • InputStreamReader(InputStream in): 创建一个使用默认字符集的字符流。
  • InputStreamReader(InputStream in, String charsetName): 创建一个指定字符集的字符流。

使用步骤:

  1. 创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称
  2. 使用InputStreamReader对象中的方法read读取文件
  3. 释放资源(会自动调用flush方法)
    注意:构造方法中指定的编码表名称要跟文件的编码相同,否则会发生乱码
public static void main(String[] args) throws IOException {
        InputStreamReader isr = new InputStreamReader(new FileInputStream("d:\\GBK.txt"),"GBK");
        int len=0;
        while((len=isr.read())!=-1){
            System.out.println((char)len);
        }
        isr.close();
    }

将GBK格式转换为UTF-8格式:

public static void main(String[] args) throws IOException {
        InputStreamReader isr = new InputStreamReader(new FileInputStream("d:\\GBK.txt"),"GBK");
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\GBK_u8.txt"),"UTF-8");
        int len=0;
        while((len=isr.read())!=-1){
            osw.write(len);
        }
        isr.close();
        osw.close();
    }

序列化

3.1 概述

Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据对象的类型对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。

反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化对象的数据对象的类型对象中存储的数据信息,都可以用来在内存中创建对象。

3.2 ObjectOutputStream类

ObjectOutputStream类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。

构造方法

  • public ObjectOutputStream(OutputStream out): 创建一个指定OutputStream的ObjectOutputStream。

特有方法:

  • public final void writeObject (Object obj) : 将指定的对象写出。

序列化操作

  1. 一个对象要想序列化,必须满足两个条件:
  • 该类必须实现java.io.Serializable 接口,Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException
  • 该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。
public class Person implements Serializable {
    private String name;
    private int age;
    ...
    }

public static void main(String[] args) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:\\person.txt"));
        oos.writeObject(new Person("zkn",22));
        oos.close();
    }

ObjectInputStream类

ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。

构造方法

  • public ObjectInputStream(InputStream in): 创建一个指定InputStream的ObjectInputStream。

反序列化操作前提

如果能找到一个对象的class文件,我们可以进行反序列化操作,调用ObjectInputStream读取对象的方法:

  • public final Object readObject () : 读取一个对象。
public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:\\person.txt"));
        Object o = ois.readObject();
        ois.close();
        System.out.println(o);
    }

打印流

java.io.PrintStream类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。

PrintStream类

构造方法

  • public PrintStream(String fileName): 使用指定的文件名创建一个新的打印流。
  • public PrintStream(OutputStream out): 使用指定的字节输出流创建一个新的打印流。
  • public PrintStream(File file): 输出的目的地是一个文件
public class PrintDemo {
    public static void main(String[] args) throws IOException {
        // 调用系统的打印流,控制台直接输出97
        System.out.println(97);
      
        // 创建打印流,指定文件的名称
        PrintStream ps = new PrintStream("ps.txt");
        
        // 设置系统的打印流流向,输出到ps.txt
        System.setOut(ps);
        // 调用系统的打印流,ps.txt中输出97
        System.out.println(97);
    }
}

相关文章

  • Java学习Day18

    今日学习内容总结 缓冲流 转换流 序列化 打印流 缓冲流 缓冲流,也叫高效流,是对4个基本的FileXxx 流的增...

  • Day18算法写作

    DAY18 学习课程:《Day18:算法写作,用数学思维写作,精密计算创作环节中的信息流程》 今日作业:复盘课程内...

  • Java day18

  • 学习本质的认识

    墨宁墨 打卡序号:【第一阶段Day18】 • 学习反思,认识自己学习存在的问题 • 学习内容:如「掌握学习本质,快...

  • 卟弃丰盛日记Day18

    卟弃丰盛日记Day18 卟弃今日计划Day18 2020.11.18...

  • 2019-01-07

    Day18【学员昵称】:沐沐【学习内容】:10.4 大小写、全角半角转换【学习心得】:学习函数用处大,随心所欲全角...

  • 每日复盘分享

    5-90/Day18/有效学习,从每日复盘分享开始 【2022.2.2/个人成长篇】《论语·先进》 【一】学习内容...

  • 2018-09-19

    Day18

  • 不给自己留退路

    2020.9.21演讲高级班学习Day18 分享人:AS07李秋香 今日总结 1、上课 2、教资学习 3、制作PP...

  • 全新Java学习完整路线图

    Java教程,Java学习,Java学习路线图,全新Java学习路线图! 深知广大爱好Java的人学习是多么困难,...

网友评论

      本文标题:Java学习Day18

      本文链接:https://www.haomeiwen.com/subject/meiouctx.html