java之IO流

news2024/11/18 17:09:45

在这里插入图片描述

1、区别

字节流以字节为单位进行读写,可以处理所有类型的数据
字符流以字符为单位进行读写,只能用于处理文本数据
字符流通常使用缓冲区,可以提高读写性能;
而字节流则可以处理二进制数据,可以进行更底层的数据操作。

2、案例

1.字节流

字节流的基类,抽象类是表示字节流的所有类的超类。

InputStream字节输入流
常用方法:
    // 从输入流中读取数据的下一个字节
    abstract int read()
    // 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b中
    int read(byte[] b)
    // 将输入流中最多 len 个数据字节读入 byte 数组
    int read(byte[] b, int off, int len)
    // 跳过和丢弃此输入流中数据的 n个字节
    long skip(long n)
    // 关闭此输入流并释放与该流关联的所有系统资源
    void close()
OutputStream字节输出流
常用方法:
    // 将 b.length 个字节从指定的 byte 数组写入此输出流
    void write(byte[] b)
    // 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
    void write(byte[] b, int off, int len)
    // 将指定的字节写入此输出流
    abstract void write(int b)
    // 关闭此输出流并释放与此流有关的所有系统资源
    void close()
    // 刷新此输出流并强制写出所有缓冲的输出字节
    void flush()

2.文件流

字节流的子类

FileInputStream
  // 读取f盘下该文件f://hell/test.txt
  //构造方法1
  InputStream inputStream = new FileInputStream(new File("f://hello//test.txt"));
  int i = 0;
  //一次读取一个字节
  while ((i = inputStream.read()) != -1) {
      // System.out.print(i + " ");// 65 66 67 68
      //为什么会输出65 66 67 68?因为字符在底层存储的时候就是存储的数值。即字符对应的ASCII码。
      System.out.print((char) i + " ");// A B C D
  }
  //关闭IO流
  inputStream.close();



// 读取f盘下该文件f://hell/test.txt
//构造方法2
InputStream inputStream2 = new FileInputStream("f://hello/test.txt");
// 字节数组
byte[] b = new byte[2];
int i2 = 0;
//  一次读取一个字节数组
while ((i2 = inputStream2.read(b)) != -1) {
    System.out.print(new String(b, 0, i2) + " ");// AB CD
}
//关闭IO流
inputStream2.close();

FileOutputStream

OutputStream outputStream = new FileOutputStream(new File("test.txt"));
        // 写出数据
        outputStream.write("ABCD".getBytes());
        // 关闭IO流
        outputStream.close();
        // 内容追加写入
        OutputStream outputStream2 = new FileOutputStream("test.txt", true);
        // 输出换行符
        outputStream2.write("\r\n".getBytes());
        // 输出追加内容
        outputStream2.write("hello".getBytes());
        // 关闭IO流
        outputStream2.close();

3、字节缓冲流

字节流的子类

BufferedInputStream

 InputStream in = new FileInputStream("test.txt");
        // 字节缓存流
        BufferedInputStream bis = new BufferedInputStream(in);
        byte[] bs = new byte[20];
        int len = 0;
        while ((len = bis.read(bs)) != -1) {
            System.out.print(new String(bs, 0, len));
            // ABCD
            // hello
        }
        // 关闭流
        bis.close();
BufferedOutputStream
 BufferedOutputStream bos = 
 	new BufferedOutputStream(new FileOutputStream("test.txt", true));
        // 输出换行符
        bos.write("\r\n".getBytes());
        // 输出内容
        bos.write("Hello Android".getBytes());
        // 刷新此缓冲的输出流
        bos.flush();
        // 关闭流
        bos.close();

4、字符流基类

 常用方法:
    // 读取单个字符
    int read()
    // 将字符读入数组
    int read(char[] cbuf)
    // 将字符读入数组的某一部分
    abstract int read(char[] cbuf, int off, int len)
    // 跳过字符
    long skip(long n)
    // 关闭该流并释放与之关联的所有资源
    abstract void close()

常用方法:
    // 写入字符数组
     void write(char[] cbuf)
    // 写入字符数组的某一部分
    abstract void write(char[] cbuf, int off, int len)
    // 写入单个字符
    void write(int c)
    // 写入字符串
    void write(String str)
    // 写入字符串的某一部分
    void write(String str, int off, int len)
    // 将指定字符添加到此 writer
    Writer append(char c)
    // 将指定字符序列添加到此 writer
    Writer append(CharSequence csq)
    // 将指定字符序列的子序列添加到此 writer.Appendable
    Writer append(CharSequence csq, int start, int end)
    // 关闭此流,但要先刷新它
    abstract void close()
    // 刷新该流的缓冲
    abstract void flush()

5、流转换/转换流

InputStreamReader和OutputStreamWriter是字符流的子类

1.字节流转换为字符流
InputStreamReader 是一个字符输入流,它将字节流转换为字符流
try (InputStream is = new FileInputStream("file.txt");
     Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {
    int c;
    while ((c = reader.read()) != -1) {
        System.out.print((char) c);
    }
} catch (IOException e) {
    e.printStackTrace();
}
2.字符流转换字节流
OutputStreamWriter 是一个字符输出流,它将字符流转换为字节流
try (OutputStream os = new FileOutputStream("file.txt");
     Writer writer = new OutputStreamWriter(os, StandardCharsets.UTF_8)) {
    writer.write("Hello, world!");
} catch (IOException e) {
    e.printStackTrace();
}

6、字符缓冲流

BufferedReade和BufferedWrite是字符流的子类

BufferedReade
try (Reader reader = new BufferedReader(new FileReader("file.txt"))) {
    int c;
    while ((c = reader.read()) != -1) {
        System.out.print((char) c);
    }
} catch (IOException e) {
    e.printStackTrace();
}
BufferedWrite
 构造方法:
    // 创建一个使用默认大小输入缓冲区的缓冲字符输入流
    BufferedReader(Reader in)
    // 创建一个使用指定大小输入缓冲区的缓冲字符输入流
    BufferedReader(Reader in, int sz)
 特有方法:
    // 读取一个文本行
    String readLine()
 构造方法:
    // 创建一个使用默认大小输出缓冲区的缓冲字符输出流
    BufferedWriter(Writer out)
    // 创建一个使用给定大小输出缓冲区的新缓冲字符输出流
    BufferedWriter(Writer out, int sz)
 特有方法:
    // 写入一个行分隔符
    void newLine() 
try (Writer writer = new BufferedWriter(new FileWriter("file.txt"))) {
    writer.write("Hello, world!");
} catch (IOException e) {
    e.printStackTrace();
}

通过使用缓冲区,可以减少读取和写入数据的次数,从而提高效率。
需要注意在使用完字符缓冲流后,要及时关闭对应的流对象,以释放资源

7、 便捷FileReader、FileWriter

 FileReader:InputStreamReader类的直接子类,用来读取字符文件的便捷类,使用默认字符编码。
 FileWriter:OutputStreamWriter类的直接子类,用来写入字符文件的便捷类,使用默认字符编码

8、高效流效率

        FileInputStream inputStream = new FileInputStream("f://滑板//HEEL_FLIP.mp4");
        BufferedInputStream bis = new BufferedInputStream(inputStream);
        FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4");
        BufferedOutputStream bos = new BufferedOutputStream(outputStream);
        int len;
        byte[] bs = new byte[1024];
        // 开始时间
        long begin = System.currentTimeMillis();
        while ((len = bis.read(bs)) != -1) {
            bos.write(bs, 0, len);
        }
        // 用时毫秒
        System.out.println(System.currentTimeMillis() - begin);// 78
        bis.close();
        bos.close();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/706651.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《PyTorch深度学习实践》第六讲 逻辑斯蒂回归

b站刘二大人《PyTorch深度学习实践》课程第六讲逻辑斯蒂回归笔记与代码:https://www.bilibili.com/video/BV1Y7411d7Ys?p6&vd_sourceb17f113d28933824d753a0915d5e3a90 分类问题: MNIST数据集:手写数字数据集;6万个训练样本…

vue3+vite+ts视频背景酷炫登录模板【英雄联盟主题】

最近我准备在自己的网站上开发一个博客系统,首先要实现后台登录界面。我选择使用Vue 3 Vite TypeScript框架来构建,下面是针对该主题的详细说明: 在网页中使用视频作为背景图已经相当常见了,而且网上也有很多相关的插件可供使用…

QT Creator上位机学习(四)多线程操作

系列文章目录 文章目录 系列文章目录前言多线程操作多线程创建基本概念接口函数线程类的定义实例 线程同步基础互斥量的线程同步基于QReadWriteLock的线程同步基于QWaitCondition的线程同步基于信号量的线程同步 总结 前言 由于目前时间比较赶,同时还在学习FreeRTO…

ModaHub 魔搭社区:火山方舟是如何解决大模型互信问题的

火山方舟是一个全面的大模型服务平台,通过整合多个大模型公司的产品,为需要大模型的企业提供联系和选择的机会。它不仅提供相关工具和服务,还构建了大模型"安全互信计算架构",解决了大模型互信的问题。 这个安全互信计算…

【ArcGIS微课1000例】0069:用ArcGIS提取一条线的高程值

本实验讲解用ArcGIS软件,基于数字高程模型DEM提取一条线的高程值并导出。 文章目录 一、加载实验数据二、将线转为折点三、提取折点高程值四、导出高程值五、注意事项【相关阅读】:【GlobalMapper精品教程】060:用dem提取一条线的高程值 一、加载实验数据 本实验使用的数据…

AI创作与游戏开发(三)世界观设计

本文将从实践出发,全方位的在美术,程序,策划, 音乐方面使用AIGC进行游戏开发的辅助创作,来探索AI的上限。 写在前面 不管AI发展到什么地步,要记住一点的是。它只是工具,还是要以我为主,为我所…

Lake Shore475高斯计使用教程

475高斯计具有双排20字符真空荧光显示屏。在正常操作下,显示屏用来显示磁场读数和功能(最大、最小值、相对读数等)信息。另外也可以被配置为显示被测磁场温度和频率等信息。当设置高斯计参数或功能时,屏幕会显示操作提示和反馈信息…

华为云Could not connect to ‘121.37.92.110‘ (port 22): Connection failed.

今天在使用xshell连接服务器的时候,一直报错,爆的心态都炸了: 在输入主机和密码都正确的情况下,还是连接不上服务器: 后来经过长时间摸索,发现xshell软件要通过镜像系统来操作,而自己买的服务器…

走进人工智能|自动驾驶 迈向无人驾驶未来

前言: 自动驾驶是一种技术,通过使用传感器、人工智能和算法来使车辆能够在不需要人类干预的情况下自主地感知、决策和操作。 文章目录 序言背景核心技术支持传感器技术人工智能与机器学习 迈向无人驾驶未来目前形式领跑人困境和挑战 总结 本篇带你走进自…

【Mysql】X-DOC:Mysql数据库大量数据查询加速(定时JOB和存储过程应用案例)

X-DOC:Mysql数据库大量数据查询加速(定时JOB和存储过程应用案例) 1、案例背景2、解决思路3、实现方式3.1 开启定时调度功能3.2 创建JOB日志表3.3 创建JOB任务3.4 创建JOB3.5 JOB的维护及查看 4、总结 1、案例背景 在某中台系统中&#xff0c…

基于HTML5的手术室信息管理系统的设计与实现(源码+文档+数据库)

本文通过对现有手术室信息管理系统分析,设计了一套基于 HTML的手术室信息管理系统,实现了患者信息、手术记录及术后随访等功能,提高了手术室工作效率。 本系统实现了患者基本资料的录入及基本信息的查询,提供了术前准备情况及术中…

Android Studio 下载安装教程

在我们下载前,先来了解一下Android的4大组件: 1.活动 2.服务:类似线程,听歌时跳转发信息,后台进行播放音乐,前台交互,后台运行任务 3.广播接收者:【例1】感知充电线充电进度&#xf…

【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !

前言: 大家好,我是良辰丫,在上一篇文章中我们已经学习了一些统一功能处理的相关知识,今天我们继续深入学习这些知识,主要学习统一异常处理,统一的返回格式,ControllerAdvice简单分析.💌💌💌 🧑个人主页:良辰针不戳 &am…

邀请功能的实现分析

邀请功能 功能分析 场景:项目中出现用户邀请其他用户加入群组的功能 需求:用户点击生成邀请链接可以生成一个url,将这个url分享给其他用户,其他用户点击后对用户登录状态进行校验,校验通过即可加入群组,…

【dubbo triple provider 底层流转】

一、maven依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-codec-http2</artifactId><version>4.1.90.Final</version> </dependency><dependency><groupId>org.apache.dubbo</groupId>&l…

vue3 父子组件传值 记录

最近这个组件之间传值用的较多&#xff0c;我这该死的记性&#xff0c;总给忘记写法&#xff0c;特此记录下 第一种 父传子 补充&#xff1a;LeftView.vue 是父组件&#xff1b; Video.vue 是子组件 第二种 子传父 Video.vue 子组件 第一步 引入&#xff1a; import { de…

Linux搭建Discuz论坛

环境&#xff1a;redhat 9 mysql 8 Discuz 3.5 题目要求&#xff1a;在 bbs.example.com 主机上创建 Discuz 论坛&#xff0c;数据库服务器使用 db.example.com 主机的 bbs 数据库实例&#xff0c;该实例由 MySQL数据库软件提供服务。 题目要求没有说是在一台虚拟机…

PostgreSQL学习笔记

目录 一、PostgreSQL安装 1、下载 2、安装 二、PostgreSQL操作 1、数据库操作 2、表操作 3、数据操作 一、PostgreSQL安装 本章节以windows系统安装为例&#xff0c;讲解PostgreSQL 15.0的安装过程。 1、下载 访问PostgreSQL官方网站&#xff0c;下载对应的安装包&am…

Qt/C++编写超精美自定义控件(历时9年更新迭代/超202个控件/祖传原创)

一、前言 无论是哪一门开发框架&#xff0c;如果涉及到UI这块&#xff0c;肯定需要用到自定义控件&#xff0c;越复杂功能越多的项目&#xff0c;自定义控件的数量就越多&#xff0c;最开始的时候可能每个自定义控件都针对特定的应用场景&#xff0c;甚至里面带了特定的场景的…

多元回归预测 | Matlab基于麻雀算法(SSA)优化混合核极限学习机HKELM回归预测, SSA-HKELM数据回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于麻雀算法(SSA)优化混合核极限学习机HKELM回归预测, SSA-HKELM数据回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 …