首页 > 编程语言 >JavaSE

JavaSE

时间:2023-03-25 16:58:27浏览次数:45  
标签:String IO close 缓冲区 new JavaSE public 字节

前言

  1. 字节流和字符流体系相同,仅操作的数据类型不同。
  2. 节点流和过滤流的关系,是装饰者模式的体现。
  3. 转换流,是适配器模式的体现。
  4. I/O 对磁盘文件的读写,针对的是 File 类。

1、流

流(Stream)内存与存储设备之间传输数据的通道

分类

  1. 按方向:以内存为基准。
    • 输入流:读操作,存储设备 → 内存。
    • 输出流:写操作,内存 → 存储设备。
  2. 按处理单位
    • 字节流:字节,可以读写任意类型数据。
    • 字符流:字符,只能读写文本类型数据。
  3. 按功能
    • 节点流实际具有传输数据的功能(具体构件)。
    • 过滤流:在节点流的基础之上增强功能(装饰者)

2、字节流

2.1、抽象类

InputStream

字节输入流

image-20220317235716205
  1. read():从输入流中读取数据的下一个字节并返回。
  2. read(byte[]):从输入流中读取数据的一部分字节,存储到缓冲区并返回读取字节数量。
  3. read(byte[], off, len):从输入流中的偏移量 off 开始读取 len 个字节,存储到缓冲区并返回读取字节数量。
  4. close():关闭输入流,释放资源。

OutputStream

字节输出流

image-20220317235732262
  1. write(int):将指定字节(ASCII 码)写入输出流。
  2. write(byte[]):将指定字节数组写入输出流。
  3. write(byte[], off, len):将指定字节数组中偏移量 off 开始的 len 个字节,写入到输出流。
  4. flush():刷新输出流,并将任何缓冲的字节写出。
  5. close():先调用 flush(),再关闭输出流,释放资源。

Hint

  • write() 仅将数据写入流中,此时位于内存,还未写到磁盘文件。
  • flush() 才将数据写到磁盘文件。

2.2、节点流

FileInputStream

使用步骤

  1. 创建流:参数为文件名

  2. 创建缓冲区:减少磁盘 I/O,提高效率

  3. 读取数据:直接读取磁盘文件

  4. 关闭流

    public void readFile(String fileName) throws IOException {
        // 1、创建流
        FileInputStream fis = new FileInputStream(fileName);
        // 2、缓冲区
        byte[] buf = new byte[1024];
        int len = 0;
        // 3、读取
        while ((len = fis.read(buf)) != -1) {
            System.out.println(new String(buf, 0, len));
        }
        // 4、关闭流
        fis.close();
    }
    

FileOutputStream

使用步骤

  1. 创建流:参数 1 为文件名,参数 2 表示是否写入方式。

    1. true:追加内容到文件中。
    2. false:覆盖文件。
  2. 写数据

  3. 刷新到磁盘

  4. 关闭流

    public void writeFile(String location) throws IOException {
        // 1、创建流
        FileOutputStream fos = new FileOutputStream(location, true);
        // 2、写
        String str = "Hello, I/O world!";
        fos.write(str.getBytes());
        // 3、刷新
        fos.flush();
        // 4、关闭流
        fos.close();
    }
    

case:文件复制

思路:输入流读取文件数据,输出流写数据。

  1. 创建流

  2. 创建缓冲区:减少磁盘 I/O,提高效率

  3. 读写数据

  4. 关闭流先开后关

    public void copyFile(String source, String dest) throws IOException {
        // 1、创建流
        FileInputStream fis = new FileInputStream(source);
        FileOutputStream fos = new FileOutputStream(dest);
        // 2、缓冲区
        byte[] buf = new byte[1024];
        int len = 0;
        // 3、读写
        while ((len = fis.read(buf)) != -1) {
            fos.write(buf, 0, len);
        }
        // 4、关闭流:先开后关
        fos.close();
        fis.close();
    }
    

2.3、缓冲流

Buffered Stream

属于过滤流(装饰者)

  1. 优点提高 I/O 效率,减少磁盘访问次数
  2. 内置缓冲区:在节点流的基础上增强的功能。
    1. Buffered Stream内置了一个缓冲区(默认大小 8K)。
    2. 调用者对 Buffered Stream 的操作,都是在内置缓冲区的操作。
  3. 使用
    1. 创建 Buffered Stream 时,需要传入节点流。
    2. 关闭 Buffered Stream 时,自动关闭节点流。

读写流程

  1. :缓冲输入流
    1. Buffered Stream 先使用节点流,读取一部分字节数到内置缓冲区。
    2. 在内置缓冲区的数据读完之前,都是从内置缓冲区中读取。
  2. :缓冲输出流
    1. Buffered Stream 先使用节点流,写入一部分字节数到内置缓冲区。
    2. 在内置缓冲区的数据写完之前,都是从内置缓冲区中写出。

BufferedInputStream

使用步骤

Hint:此处缓冲区是节点流用于批量读取字节的缓冲区,不是缓冲流的内置缓冲区。

public void readFile(String filename) throws IOException {
    // 1、创建流
    FileInputStream fis = new FileInputStream(filename);
    BufferedInputStream bis = new BufferedInputStream(fis);
    // 2、缓冲区(Hint)
    byte[] buf = new byte[1024];
    int len = 0;
    // 3、读取
    while ((len = bis.read(buf)) != -1) {
        System.out.print(new String(buf, 0, len));
    }
    // 3、关闭流
    bis.close();
}

BufferedOutputStream

使用步骤

public void writeFile(String location) throws IOException {
    // 1、创建流
    FileOutputStream fos = new FileOutputStream(location);
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    // 2、写
    String str = "Hello, buffer I/O";
    for (int i = 0; i < 10; i++) {
        bos.write(str.getBytes());
        // 3、刷新
        bos.flush();
    }
    // 4、关闭流
    bos.close();
}

case:文件复制

思路:输入流读取文件数据,输出流写数据。

  1. 创建流:节点流、过滤流

  2. 创建缓冲区

  3. 读写数据

  4. 关闭流:只需关闭过滤流,内部自动关闭节点流。

    public void copyFile(String source, String dest) throws IOException {
        // 1、 创建流
        FileInputStream fis = new FileInputStream(source);
        FileOutputStream fos = new FileOutputStream(dest);
        BufferedInputStream bis = new BufferedInputStream(fis);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        // 2、缓冲区
        byte[] buf = new byte[1024];
        int len = 0;
        // 3、读写
        while ((len = bis.read(buf)) != -1) {
            bos.write(buf, 0, len);
            bos.flush();
        }
        // 4、关闭连接
        bos.close();
        bis.close();
    }
    

2.4、对象流

ObjectStream

字节流的子类,属于过滤流

增强功能

  1. 内置缓冲区
  2. 读写对象
    1. 序列化:向流中写入一个对象
    2. 反序列化:从流中读取一个对象

标签:String,IO,close,缓冲区,new,JavaSE,public,字节
From: https://www.cnblogs.com/secretmrj/p/17255045.html

相关文章

  • JavaSE
    File:用于代表磁盘中的一个文件或文件夹(未必真实存在),提供操作文件本身的方法。1、常用属性路径分隔符:;pathSeparator``pathSeparatorChar`名称分隔符:\Separ......
  • 如何在Android Studio中创建自定义图标
    今天学习时发现了一个很棒的功能,那就是在AndroidStudio中创建自定义图标,我们在开发app时,常需要用到一些图标,我们当然可以去网上公共素材库找,但是大小什么的往往不尽......
  • 关于Claims Transformation的问题
    原文关于ClaimsTransformation 看的有点不明白的,可以参考这篇文章的翻译:https://www.cnblogs.com/irocker/p/Ocelot-claimstransformation.html这里主要记录一下我遇到......
  • VS 2022 不支持 .NET Framework 4.5 项目解决办法(Visual Studio 2022)
    用友U9CUBF开发平台生成的项目,默认使用的是.net4.5 但是VISUALstudio2022已经不支持这个版本了,解决方法:手动拷贝4.5的文件到两个文件夹C:\Windows\Micros......
  • su: Authentication failure
    su:Authenticationfailure  原因可能是还没有设置su,需要设置su解决方法:输入sudopasswdroot......
  • c++union用法
    参考文章:c++中union的使用  union使用方法union即为联合,它是一种特殊的类。通过关键字union进行定义,一个union可以有多个数据成员。在任意时刻,联合中只能有一个数据成......
  • Android Studio Gradle Sync issues问题
     当时重装系统,发现出了这个问题,展开发现JDK相关。 在csdn搜索,后将默认的更改为java用的8版本。    退出,重新进入,完成。第一次耗时很久,33分钟。后面再进就......
  • IDEA Rebuild项目错误:Information:java: java.lang.AssertionError: Value of x -1
    模仿lombok工具,我的enumgen工具写完了。  公司的项目emax-rpcapi-list依赖了enumgen后,IDEARebuildProject时,或者mavenpackage/install的时候,出现报错→Information:java......
  • Measuring the diversity of recommendations: a preference-aware approach for eval
    目录概RMSDE代码MeymandpourR.andDavisJ.G.Measuringthediversityofrecommendations:apreference-awareapproachforevaluatingandadjustingdiversity.......
  • 「Gym102759B」Cactus Competition 题解
    传送门「Gym102759B」CactusCompetition题目大意有一个\(n\timesm\)的网格图,一个长度为\(n\)的序列\(a\),和一个长度为\(m\)的序列\(b\)。网格图中,第\(i\)......