专栏首页咕咕星java_缓冲流、转换流、序列化流

java_缓冲流、转换流、序列化流

一、缓冲流

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

字节缓冲流

构造方法

创建字节缓冲输入流: BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt")); 创建字节缓冲输出流: BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));

代码演示:

public class Demo {
    public static void main(String[] args) throws IOException {
        // 记录开始时间
        long start = System.currentTimeMillis();
        // 创建流对象
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("ChromeSetup.exe"));
                BufferedOutputStream bos = new BufferedOutputStream(
                        new FileOutputStream("d:\\ChromeSetup_copy.exe"));) {
            // 读写数据
            int len;
            byte[] bytes = new byte[8 * 1024];
            while ((len = bis.read(bytes)) != -1) {
                bos.write(bytes, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 记录结束时间
        long end = System.currentTimeMillis();
        System.out.println("缓冲流使用数组复制时间:" + (end - start) + " 毫秒");

    }
}

输出结果为:
缓冲流使用数组复制时间:10 毫秒

字符缓冲流

构造方法

创建字符缓冲输入流 BufferedReader br = new BufferedReader(new FileReader("br.txt")); 创建字符缓冲输出流 BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));

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

readLine 方法演示

public class Demo {
    public static void main(String[] args) throws IOException {
        // 创建流对象
        BufferedReader br = new BufferedReader(new FileReader("a.txt"));
        // 定义字符串,保存读取的一行文字
        String line = null;
        // 循环读取,读取到最后返回null
        while ((line = br.readLine())!=null) {
            System.out.println(line);
        }
        // 释放资源
        br.close();     
    }
}

输出结果为:
aaaaa
bbbbb
ccccc

newLine 方法演示

public class Demo {
    public static void main(String[] args) throws IOException {
        // 创建流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
        // 写出数据
        bw.write("ccccc");
        // 写出换行
        bw.newLine();
        bw.write("bbbbb");
        bw.newLine();
        bw.write("aaaaa");
        bw.newLine();
        // 释放资源
        bw.close();
    }
}

输出结果为:
ccccc
bbbbb
aaaaa

二、转换流

InputStreamReader类

转换流 java.io.InputStreamReader ,是Reader的子类,,读取字节并使用指定的字符集将其解码为字符。它的字符集可以自定义,也可以用平台的默认字符集。

构造方法

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

OutputStreamWriter类

转换流 java.io.OutputStreamWriter ,是Writer的子类,用指定的字符集将字符编码为字节。它的字符集可以自定义,也可以用平台的默认字符集。

构造方法

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

代码演示:

public class Demo {
    public static void main(String[] args) throws IOException {

        // 1.定义文件路径
        String a= "a.txt";
        String b= "b.txt";
        // 2.创建流对象
        // 2.1 转换输入流,指定GBK编码
        InputStreamReader isr = new InputStreamReader(new FileInputStream(a) , "GBK");
        // 2.2 转换输出流,默认utf8编码
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(b));
        // 3.读写数据
        // 3.1 定义数组
        char[] c = new char[1024];
        // 3.2 定义长度
        int len;
        // 3.3 循环读取
        while ((len = isr.read(c)) != -1) {
            // 循环写出
        osw.write(c,0,len);
        }
        // 4.释放资源
        osw.close();
        isr.close();
    }

}

三、序列化流

ObjectOutputStream类

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

构造方法

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

对象序列化注意:

该类必须实现 java.io.Serializable 接口,Serializable是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出 NotSerializableException 。

该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用 transient 关键字修饰

写出对象方法:

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

ObjectInputStream类

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

构造方法

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

对象反序列化注意:

必须是能够找到class文件的类。如果找不到该类的class文件,则抛出一个 ClassNotFoundException 异常。

能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个 InvalidClassException 异常

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

public final Object readObject () : 读取一个对象

代码演示:

public class Demo {
    public static void main(String[] args) throws Exception {
        // 创建 学生对象
        Student student = new Student("张三", "zahgnsan");
        Student student2 = new Student("李四", "lisi");
        Student student3 = new Student("王五", "wagnwu");
        ArrayList<Student> arrayList = new ArrayList<>();
        arrayList.add(student);
        arrayList.add(student2);
        arrayList.add(student3);
        // 序列化操作
        serializ(arrayList);
        // 反序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("list.txt"));
        // 读取对象,强转为ArrayList类型

        ArrayList<Student> list = (ArrayList<Student>) ois.readObject();
        for (int i = 0; i < list.size(); i++) {
            Student s = list.get(i);
            System.out.println(s.getName() + "--" + s.getPwd());
        }
    }

    private static void serializ(ArrayList<Student> arrayList) throws Exception {
        // 创建 序列化流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("list.txt"));
        // 写出对象
        oos.writeObject(arrayList);
        // 释放资源
        oos.close();

    }

}

四、打印流

PrintStream类

java.io.PrintStream 类,该类能够方便地打印各种数据类型的值

构造方法

public PrintStream(String fileName) : 使用指定的文件名创建一个新的打印流

System.out 就是 PrintStream 类型的,只不过它的流向是系统规定的,打印在控制台上

代码演示:

public class Demo {
    public static void main(String[] args) throws IOException {
        // 控制台直接输出张三
        System.out.println("张三");
        // 创建打印流,指定文件的名称
        PrintStream zs = new PrintStream("zs.txt");
        // 设置系统的打印流流向,输出到zs.txt
        System.setOut(zs);
        // 调用系统的打印流,zs.txt中输出张三
        System.out.println("张三");
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java_Object类、日期时间类、System类、包装类

    java.lang.Object 类是所有类的父类。它描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。

    咕咕星
  • java_Collection、Map、泛型的使用

    集合按照其存储结构可以分为两大类,分别是 单列集合 java.util.Collection 双列集合 java.util.Map

    咕咕星
  • java_String类、StringBuilder类、Arrays类、Math类的使用

    java.lang.String 类代表字符串。Java程序中所有的字符串文字(例如 "abc" )都可以被看作是实现此类的实例

    咕咕星
  • 13.json解析

    六月的雨
  • Java-内部类

    如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象(在静态方法内部创建某个内部类的对象),那么必须像在main()方法中那样,具体地指明这个对象的类型...

    桑鱼
  • GreenDao 工具类 --- 使用 Json 快速生成 Bean、表及其结构,"炒鸡"快!

    作者:林冠宏 / 指尖下的幽灵 腾讯云+社区:https://cloud.tencent.com/developer/user/1148436/activi...

    林冠宏-指尖下的幽灵
  • 装饰者模式与IO流的应用

    装饰者模式是一种对象结构型模式。动态地给一个对象添加一些额外的职责,就增加功能来说,装饰者模式比生成子类更为灵活。

    java技术爱好者
  • Java企业微信开发_04_消息推送之发送消息(主动)

    (1)流程不同:发送消息是第三方服务器主动通知微信服务器向用户发消息。而被动回复消息是 用户发送消息之后,微信服务器将消息传递给 第三方服务器,第三方服务器接收...

    shirayner
  • 初识Shiro

    Shiro是Apache基金会下的一个开源安全框架,提供了身份验证、授权、密码学和会话管理等功能,Shiro框架不仅直观易用,而且也能提供健壮的安全性,另外一点...

    江南一点雨
  • Java开发小技巧

    平时开发中有一些小技巧,都不算很有技术含量,但在工作中运用这些技巧确实可以提高工作效率,这里把这些小技分享出来。

    jeremyxu

扫码关注云+社区

领取腾讯云代金券