Java中 IO 流分为几种,什么时候用,怎么用

Java中 IO 流分为几种,什么时候用,怎么用

在这里插入图片描述

亲爱的朋友,
在这美好的时刻,愿你收获满满的幸福与喜悦。愿生活的每一天都充满温馨和笑声,愿你在每一个梦想的追逐中都能找到成就和满足。
愿你的心中充满爱和宽容,与亲朋好友分享快乐,携手度过生命中的点点滴滴。无论前方的路有多曲折,都相信阳光终将洒向你的心田。
愿你的梦想翱翔于蔚蓝的天空,如同一朵灿烂的彩云,散发着希望和勇气。在每个日出的时刻,都能感受到生命的美好和奇迹。
愿你的岁月如诗,平淡而又美好。在每一个日落的瞬间,都能沐浴在幸福的余晖中,感受到生活的宁静与淡然。
祝福你,生活幸福美满,一切安好如你所愿。
最诚挚的祝愿,

前言

Java 中的 I/O(输入/输出)流可以分为四类:字节流、字符流、字节缓冲流和字符缓冲流。每一类都有其特定的用途和适用场景。

  1. 字节流(Byte Streams):
    • FileInputStreamFileOutputStream 用于文件的字节读取和写入。
    • ByteArrayInputStreamByteArrayOutputStream 用于处理字节数组。
  2. 字符流(Character Streams):
    • FileReaderFileWriter 用于文件的字符读取和写入。
    • StringReaderStringWriter 用于处理字符串。
    • BufferedReaderBufferedWriter 提供了缓冲功能,可以提高读写性能。
  3. 字节缓冲流(Byte Buffered Streams):
    • BufferedInputStreamBufferedOutputStream 提供了缓冲功能,可以提高字节流的读写性能。
  4. 字符缓冲流(Character Buffered Streams):
    • BufferedReaderBufferedWriter 提供了缓冲功能,可以提高字符流的读写性能。

在这里,我们开篇明义,首先介绍了几种IO流,现在,我们大概就有一个提纲,我们接下来进行详细解释每一种流的用法,并且使用代码进行详细演示

字节流

  1. FileInputStream 和 FileOutputStream:
    • FileInputStream 用于从文件中读取字节流。
    • FileOutputStream 用于向文件写入字节流。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class FileInputStreamExample {public static void main(String[] args) {try (FileInputStream input = new FileInputStream("input.txt")) {int data;while ((data = input.read()) != -1) {// 处理字节数据System.out.print((char) data);}} catch (IOException e) {e.printStackTrace();}}
}public class FileOutputStreamExample {public static void main(String[] args) {try (FileOutputStream output = new FileOutputStream("output.txt")) {String data = "Hello, Byte Streams!";output.write(data.getBytes());} catch (IOException e) {e.printStackTrace();}}
}
  1. ByteArrayInputStream 和 ByteArrayOutputStream:
    • ByteArrayInputStream 允许从字节数组中读取数据。
    • ByteArrayOutputStream 允许将数据写入到字节数组中。
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;public class ByteArrayInputStreamExample {public static void main(String[] args) {byte[] data = { 65, 66, 67, 68 }; // ASCII codes for A, B, C, Dtry (ByteArrayInputStream input = new ByteArrayInputStream(data)) {int value;while ((value = input.read()) != -1) {System.out.print((char) value);}} catch (IOException e) {e.printStackTrace();}}
}public class ByteArrayOutputStreamExample {public static void main(String[] args) {try (ByteArrayOutputStream output = new ByteArrayOutputStream()) {String data = "Hello, ByteArray Streams!";output.write(data.getBytes());byte[] result = output.toByteArray();// 处理 result 数组中的字节数据} catch (IOException e) {e.printStackTrace();}}
}

字符流

  1. FileReader 和 FileWriter:
    • FileReader 用于从文件中读取字符流。
    • FileWriter 用于向文件写入字符流。
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class FileReaderWriterExample {public static void main(String[] args) {try (FileReader reader = new FileReader("input.txt");FileWriter writer = new FileWriter("output.txt")) {int data;while ((data = reader.read()) != -1) {// 处理字符数据writer.write(data);}} catch (IOException e) {e.printStackTrace();}}
}
  1. StringReader 和 StringWriter:
    • StringReader 允许从字符串中读取字符数据。
    • StringWriter 允许将字符数据写入到字符串中。
import java.io.StringReader;
import java.io.StringWriter;
import java.io.IOException;public class StringReaderWriterExample {public static void main(String[] args) {String data = "ABCDEF";try (StringReader reader = new StringReader(data);StringWriter writer = new StringWriter()) {int value;while ((value = reader.read()) != -1) {// 处理字符数据writer.write(value);}String result = writer.toString();// 处理 result 字符串} catch (IOException e) {e.printStackTrace();}}
}
  1. BufferedReader 和 BufferedWriter:
    • BufferedReader 提供了缓冲功能,以便高效读取字符流。
    • BufferedWriter 提供了缓冲功能,以便高效写入字符流。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class BufferedReaderWriterExample {public static void main(String[] args) {try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"));BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {String line;while ((line = reader.readLine()) != null) {// 处理每行字符数据writer.write(line);writer.newLine(); // 添加换行符}} catch (IOException e) {e.printStackTrace();}}
}

字节缓冲流

  1. BufferedInputStream:
    • BufferedInputStream 继承自 FilterInputStream,它提供了带缓冲的输入流功能。
    • 主要用于包装其他的输入流,以提高读取性能。
    • 具备 read() 方法,但相比原始的 InputStream,它会从缓冲区读取,而不是每次都直接从底层流读取。
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;public class BufferedInputStreamExample {public static void main(String[] args) {try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt"))) {int data;while ((data = bis.read()) != -1) {// 处理字节数据System.out.print((char) data);}} catch (IOException e) {e.printStackTrace();}}
}
  1. BufferedOutputStream:
    • BufferedOutputStream 继承自 FilterOutputStream,它提供了带缓冲的输出流功能。
    • 主要用于包装其他的输出流,以提高写入性能。
    • 具备 write() 方法,但相比原始的 OutputStream,它会将数据先写入缓冲区,而不是每次都直接写入底层流。
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class BufferedOutputStreamExample {public static void main(String[] args) {try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) {String data = "Hello, Buffered Streams!";bos.write(data.getBytes());} catch (IOException e) {e.printStackTrace();}}
}

字符缓冲流

字符缓冲流是用于提高字符流读写性能的装饰者模式实现。它们内部包含了一个缓冲区,通过缓冲区来减少对底层输入/输出流的直接读写次数,从而提高效率。在 Java 中,字符缓冲流有两个主要的类:BufferedReaderBufferedWriter

  1. BufferedReader:
    • BufferedReader 继承自 Reader,它提供了带缓冲的字符输入流功能。
    • 主要用于包装其他的字符输入流,以提高读取性能。
    • 具备 read() 方法,但相比原始的 Reader,它会从缓冲区读取,而不是每次都直接从底层流读取。
    • 提供了 readLine() 方法,可以一次读取一行文本。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class BufferedReaderExample {public static void main(String[] args) {try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"))) {String line;while ((line = reader.readLine()) != null) {// 处理每行字符数据System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}
  1. BufferedWriter:
    • BufferedWriter 继承自 Writer,它提供了带缓冲的字符输出流功能。
    • 主要用于包装其他的字符输出流,以提高写入性能。
    • 具备 write() 方法,但相比原始的 Writer,它会将数据先写入缓冲区,而不是每次都直接写入底层流。
    • 提供了 newLine() 方法,可以插入平台特定的换行符。
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;public class BufferedWriterExample {public static void main(String[] args) {try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {String data = "Hello, Buffered Streams!";writer.write(data);writer.newLine(); // 添加换行符// 其他写入操作} catch (IOException e) {e.printStackTrace();}}
}

在这两个例子中,BufferedReaderBufferedWriter 分别包装了 FileReaderFileWriter。使用缓冲流的好处在于它们可以减少对磁盘或网络的实际读写操作次数,提高程序的性能。

总结

BufferedReaderBufferedInputStream 都是用于提高 I/O 性能的缓冲流,但它们分别用于字符流和字节流。以下是它们之间的主要区别:

  1. 数据类型:

    • BufferedReader 是字符缓冲流,用于处理字符数据。
    • BufferedInputStream 是字节缓冲流,用于处理字节数据。
  2. 继承关系:

    • BufferedReader 继承自 Reader,属于字符流的一部分。
    • BufferedInputStream 继承自 FilterInputStream,属于字节流的一部分。
  3. 读取方法:

    • BufferedReader 提供了 read() 方法用于读取字符,以及 readLine() 方法用于读取一行字符数据。
    • BufferedInputStream 提供了 read() 方法用于读取字节数据。
  4. 适用场景:

    • 使用 BufferedReader 时,通常用于读取文本文件,以便按行读取和处理字符数据。
    • 使用 BufferedInputStream 时,通常用于处理二进制文件,如图像、音频或视频文件等。

下面是一个简单的示例,演示如何使用 BufferedReaderBufferedInputStream 分别读取文件中的字符和字节数据:

import java.io.*;public class BufferedStreamsExample {public static void main(String[] args) {// 使用 BufferedReader 读取字符数据try (BufferedReader reader = new BufferedReader(new FileReader("textfile.txt"))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}// 使用 BufferedInputStream 读取字节数据try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("binaryfile.bin"))) {int data;while ((data = bis.read()) != -1) {System.out.print((char) data);}} catch (IOException e) {e.printStackTrace();}}
}

我们介绍了几种不同类型的IO流,并且对于其使用场景和方法做了一个介绍,这里呢,我也是对于自己的基础做一个回顾总结和扎实,希望可以帮到大家!我们一起学习,一起进步!加油!!!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【BIAI】Lecture 12 - Emotion in Brain AI

Emotion in Brain & AI 专业术语 Limbic system 边缘系统 Amygdala 杏仁核 temporal lobe 颞叶 hippocampus 海马体 Central Nucleus 中央核 medial amygdala 内侧杏仁核 ventral periaqueductal gray 腹侧中脑导水管周围灰质 课程大纲 What is emotion 当大脑检测到某些具…

OpenGL 入门(九)—Material(材质)和 光照贴图

文章目录 材质设置材质光的属性脚本实现 光照贴图漫反射贴图高光反射贴图 材质 材质本质是一个数据集,主要功能就是给渲染器提供数据和光照算法。 如果我们想要在OpenGL中模拟多种类型的物体,我们必须针对每种表面定义不同的材质(Material)属性。 我们…

【保姆级教程|YOLOv8改进】【5】精度与速度双提升,使用FasterNet替换主干网络

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

unity 增加系统时间显示、FPS帧率、ms延迟

代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;using UnityEngine;public class Frame : MonoBehaviour {// 记录帧数private int _frame;// 上一次计算帧率的时间private float _lastTime;// 平…

Redis(三)主从架构、Redis哨兵架构、Redis集群方案对比、Redis高可用集群搭建、Redis高可用集群之水平扩展

转自 极客时间 Redis主从架构 redis主从架构搭建,配置从节点步骤: 1、复制一份redis.conf文件2、将相关配置修改为如下值: port 6380 pidfile /var/run/redis_6380.pid # 把pid进程号写入pidfile配置的文件 logfile "6380.log" …

【大数据】Flink 中的 Slot、Task、Subtask、并行度

Flink 中的 Slot、Task、Subtask、并行度 1.并行度2.Task 与线程3.算子链与 slot 共享资源组4.Task slots 与系统资源5.总结 我们在使用 Flink 时,经常会听到 task,slot,线程 以及 并行度 这几个概念,对于初学者来说,这…

canvas缩放坐标系(scale)

查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

GaussDB HCS 轻量化部署软件下载指引

一、Support 账号准备 1. 账号说明 华为的软件服务在华为support网站发布,注册该账号后,可以申请软件、下载离线文档,查看技术案例等功能 2. 账号注册 步骤 1:点击如下官方链接 华为运营商技术支持 - 华为 步骤 2&#xff1…

「深度学习」门控循环单元GRU

一、梯度消失问题 梯度消失&#xff1a; 基础的 RNN 模型不善于处理长期依赖关系&#xff0c;有很多局部影响&#xff0c;很难调整自己前面的计算。y^{<i>} 仅仅受自己附近的值影响。 解决方法&#xff1a;GRU 或 LSTM 梯度爆炸&#xff1a; 反向传播时&#xff0c;随着…

鸿蒙开发系列教程(十四)--组件导航:Tabs 导航

Tabs 导航 Tabs组件的页面组成包含两个部分&#xff0c;分别是TabContent和TabBar。TabContent是内容页&#xff0c;TabBar是导航页签栏 每一个TabContent对应的内容需要有一个页签&#xff0c;可以通过TabContent的tabBar属性进行配置 设置多个内容时&#xff0c;需在Tabs…

【力扣】无重复字符的最长子串,滑动窗口+哈希集合+优化

无重复字符的最长子串原题地址 方法一&#xff1a;滑动窗口 考虑用2个指针来维护子串&#xff0c;使得这条子串没有重复字符。 i和j表示下标&#xff0c;[i,j]表示子串&#xff0c;长度为j-i1。我们可以用i遍历字符串的所有字符&#xff0c;对于每一个i&#xff0c;都尽可能…

无人零售模式下,“IoT+鸿蒙”实现零代码搭建自动售货机监控大屏的可能性摸索

前言 新零售模式下&#xff0c;对loT的探索与应用还在继续。 而数字时代&#xff0c;数字化转型在零售行业中蔓延&#xff0c;而对于新的消费方式的探索&#xff0c;也在如火如荼的进行中。于是&#xff0c;一种新零售的形式——无人零售逐渐形成概念。 如果说&#xff0c;人…