day17-缓冲流&转换流&序列化流&打印流&Properties(一)

简介: day17-缓冲流&转换流&序列化流&打印流&Properties

day17_JAVAOOP

课程目标

1. 【理解】什么是缓冲流
2. 【掌握】缓冲流的使用
3. 【理解】转换流
4. 【理解】序列化流
5. 【理解】打印流
6. 【掌握】Properties集合的使用

缓冲流

前期我们学习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流。比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等等。这些功能更为强大的流,都是在基本的流对象基础之上创建而来的,就像穿上铠甲的武士一样,相当于是对基本流对象的一种增强。

缓冲流概述

缓冲流,也叫高效流,是对4个基本的`FileXxx` 流的增强,所以也是4个流,按照数据类型分类
通过定义数组的方式确实比以前一次读取一个字节的方式快很多,所以,看来有一个缓冲区还是非常好的。
既然是这样的话,那么,java开始在设计的时候,它也考虑到了这个问题,就专门提供了带缓冲区的字节类。
这种类被称为:缓冲区类(高效类)
写数据:BufferedOutputStream
读数据:BufferedInputStream
构造方法可以指定缓冲区的大小,但是我们一般用不上,因为默认缓冲区大小就足够了。
为什么不传递一个具体的文件或者文件路径,而是传递一个OutputStream对象呢?
 原因很简单,字节缓冲区流仅仅提供缓冲区,为高效而设计的。但是呢,真正的读写操作还得靠基本的流对象实现。
名称
字节缓冲流 BufferedInputStreamBufferedOutputStream
字符缓冲流 BufferedReaderBufferedWriter

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

字节缓冲流

构造方法

方法名 说明
public BufferedInputStream(InputStream in) 创建一个 新的缓冲输入流。
public BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流。

字节缓冲输出流

public class BufferedDemo {
        public static void main(String[] args) throws IOException {
        //相当于把字节流进行了一次装
        //FileOutputStream fos = new FileOutputStream("a.txt");
        //BufferedOutputStream bos = new BufferedOutputStream(fos);
        //简单写法
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt"));
        //也可以进行追加
        //BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt",true));
        //写一个字节
        bos.write(97);
        //写一个字节数组
        byte[] by = {97,98,99};
        bos.write(by);
        bos.write("hello".getBytes());
        //指定写一个字节
        bos.write(by,1,2);
        //关闭
        bos.close();
    }
}

字节缓冲输入流

public class BufferedDemo {
    public static void main(String[] args) throws IOException {
        //字节输入缓冲流
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
        //一次读出一个字节
        int read = bis.read();
        System.out.println((char)read);
        //一次读出一个字节数组
        byte[] by = new byte[1024];
        int len;
        while ((len = bis.read(by)) != -1){
            System.out.println(new String(by,0,len));
        }
    }
}

字节缓冲流复制

public static void main(String[] args) throws IOException {
    //读
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
    //写
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.txt"));
    //复制
    byte[] bys = new byte[1024];
    int len =0;
    while((len = bis.read(bys)) != -1){
      bos.write(bys,0,len);
    }
    bis.close();
    bos.close();
  }

测试

/*
 * 需求:把D:\\工作\\EV已录视频\\01-课程介绍.mp4复制到当前项目目录下的copy.mp4中
 * 
 * 字节流四种方式复制文件:
 * 基本字节流一次读写一个字节: 共耗时:117235毫秒
 * 基本字节流一次读写一个字节数组: 共耗时:156毫秒
 * 高效字节流一次读写一个字节: 共耗时:1141毫秒
 * 高效字节流一次读写一个字节数组: 共耗时:47毫秒
 */
public class CopyMp4Demo {
  public static void main(String[] args) throws IOException {
    long start = System.currentTimeMillis();
     method1("D:\\工作\\EV已录视频\\01-课程介绍.mp4", "copy1.mp4");
     method2("D:\\工作\\EV已录视频\\01-课程介绍.mp4", "copy2.mp4");
     method3("D:\\工作\\EV已录视频\\01-课程介绍.mp4", "copy3.mp4");
     method4("D:\\工作\\EV已录视频\\01-课程介绍.mp4", "copy4.mp4"); 
    long end = System.currentTimeMillis();
    System.out.println("共耗时:" + (end - start) + "毫秒");
  }
  // 高效字节流一次读写一个【字节数组】:
  public static void method4(String srcString, String destString)
      throws IOException {
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
        srcString));
    BufferedOutputStream bos = new BufferedOutputStream(
        new FileOutputStream(destString));
    byte[] bys = new byte[1024];
    int len = 0;
    while ((len = bis.read(bys)) != -1) {
      bos.write(bys, 0, len);
    }
    bos.close();
    bis.close();
  }
  // 高效字节流一次读写一个【字节】:
  public static void method3(String srcString, String destString)
      throws IOException {
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
        srcString));
    BufferedOutputStream bos = new BufferedOutputStream(
        new FileOutputStream(destString));
    int by = 0;
    while ((by = bis.read()) != -1) {
      bos.write(by);
    }
    bos.close();
    bis.close();
  }
  // 基本字节流一次读写一个字节数组
  public static void method2(String srcString, String destString)
      throws IOException {
    FileInputStream fis = new FileInputStream(srcString);
    FileOutputStream fos = new FileOutputStream(destString);
    byte[] bys = new byte[1024];
    int len = 0;
    while ((len = fis.read(bys)) != -1) {
      fos.write(bys, 0, len);
    }
    fos.close();
    fis.close();
  }
  // 基本字节流一次读写一个字节
  public static void method1(String srcString, String destString)
      throws IOException {
    FileInputStream fis = new FileInputStream(srcString);
    FileOutputStream fos = new FileOutputStream(destString);
    int by = 0;
    while ((by = fis.read()) != -1) {
      fos.write(by);
    }
    fos.close();
    fis.close();
  }
}

字符缓冲流

构造方法

方法名 说明
public BufferedReader(Reader in) 创建一个 新的缓冲输入流。
public BufferedWriter(Writer out) 创建一个新的缓冲输出流。

字符缓冲输出流

public static void main(String[] args) throws IOException {
        //字符输出流
        BufferedWriter bw = new BufferedWriter(new FileWriter("c.txt"));
        bw.write(97);
        bw.write("hello");
        char[] chs = {'j','a','v','a',};
        bw.write(chs);
        bw.close();
    }

字符缓冲输入流

public static void main(String[] args) throws IOException {
        //字符输入流
        BufferedReader br = new BufferedReader(new FileReader("c.txt"));
        //读一个字符
        int read = br.read();
        System.out.println(read);
        //循环读
        int ch;
        while ( (ch = br.read()) != -1){
            System.out.print((char)ch);
        }
        //循环读字符数组
        char[] c = new char[1024];
        int ch2;
        while ( (ch2 = br.read(c)) != -1){
            System.out.print(new String(c,0,ch2));
        }
    }

字符流缓冲流复制

/*
 * 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
 * 
 * 数据源:
 *    a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader -- FileReader -- BufferedReader
 * 目的地:
 *    b.txt -- 写出数据 -- 字符转换流 -- OutputStreamWriter -- FileWriter -- BufferedWriter
 */
public class CopyFileDemo {
  public static void main(String[] args) throws IOException {
    // 封装数据源 读
    BufferedReader br = new BufferedReader(new FileReader("a.txt"));
    // 封装目的地 写
    BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
    // 两种方式其中的一种一次读写一个字符数组
    char[] chs = new char[1024];
    int len = 0;
    while ((len = br.read(chs)) != -1) {
      bw.write(chs, 0, len);
      bw.flush();
    }
    // 释放资源
    bw.close();
    br.close();
  }
}

字符缓冲流特有方法

类名 方法名 说明
BufferedReader public String readLine() 一次读取一行文字
BufferedWriter public void newLine() 写一行行分隔符,由系统属性定义符号
/*
 * 字符缓冲流的特殊方法:
 * BufferedWriter:
 *        public void newLine():根据系统来决定换行符  写入时换行
 */
public static void main(String[] args) throws IOException {
    // 创建字符缓冲输出流对象
    BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
    for (int x = 0; x < 10; x++) {
        bw.write("hello" + x);
        // bw.write("\r\n");//之前换行做法
        bw.newLine();//现在换行做法
        bw.flush();
    }
    bw.close();
}
/*
 * 字符缓冲流的特殊方法:
 * BufferedReader:
 *        public String readLine():一次读取一行数据
 *        包含该行内容的字符串,不包含任何行终止符(不包含换行),如果已到达流末尾,则返回 null
 */
public static void main(String[] args) throws IOException {
    // 创建字符缓冲输入流对象
    BufferedReader br = new BufferedReader(new FileReader("bw2.txt"));
    // String line = br.readLine();//一次读取一行数据
    // System.out.println(line);
    // 最终版代码
    String line = null;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
    //释放资源
    br.close();
}



day17-缓冲流&转换流&序列化流&打印流&Properties(二)https://developer.aliyun.com/article/1433718

目录
相关文章
|
6月前
|
存储 算法 Java
从零开始学习 Java:简单易懂的入门指南之IO序列化、打印流、压缩流(三十三)
从零开始学习 Java:简单易懂的入门指南之IO序列化、打印流、压缩流(三十三)
|
6月前
|
存储 自然语言处理 Java
java缓冲流、转换流、序列化流、打印流
java缓冲流、转换流、序列化流、打印流介绍
|
6月前
day17-缓冲流&转换流&序列化流&打印流&Properties(三)
day17-缓冲流&转换流&序列化流&打印流&Properties
58 1
|
6月前
|
存储 自然语言处理 Java
day17-缓冲流&转换流&序列化流&打印流&Properties(二)
day17-缓冲流&转换流&序列化流&打印流&Properties
61 1
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
11天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
21天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
1月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
21天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
19 0