字节流和字符流的相关知识
目录
- 1. Writer
- 1.1 写两行数据
- 1.2 换一种方式
- 1.3 追加数据
- 1.4 写很多数据,记得要清一下缓存
- 1.5 用数组、字符串写入
- 2. Reader
- 2.1 读个文件
- 2.2 读取字符
- 2.3 读取数据到数组
- 2.4 复制文件
- 3. InputStream
- 4. OutputStream
- 5. 参考链接
1. Writer
Writer类是Java.io包中的一个抽象类,用来将字符或字符串写入到输出流中。Writer类继承了Java.io.Writer类的一些方法,并添加了一些新的方法来实现字符和字符串的输出。Writer类是抽象类,不能直接使用,需要使用他的子类对象来操作输出流。
Writer类的常用子类有:
- FileWriter:用于将字符或字符串写入文件中。
- StringWriter:用于将字符或字符串写入到字符串缓冲区中。
- BufferedWriter:将文本数据写入到输出流中,比如文件或网络连接。它可以一次写入一个字符、字符数组或字符串,并将数据缓存到内存中,然后在适当的时候将缓冲区中的数据一次性写入输出流。
使用BufferedWriter的步骤如下:
- 创建一个BufferedWriter对象,可以通过传入一个Writer对象作为参数来实现。
- 使用BufferedWriter的write方法将数据写入缓冲区。
- 使用BufferedWriter的flush方法将缓冲区中的数据写入输出流,可以在写入完毕后调用该方法,也可以在需要时手动调用。
- 使用BufferedWriter的close方法关闭输出流,关闭之前会自动调用flush方法。
举几个例子:
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, World!";writer.write(data);writer.flush();} catch (IOException e) {e.printStackTrace();}}
}
1.1 写两行数据
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;public class BufferWriterDemo {public static void main(String[] args) {//创建高效缓冲字符输出流BufferedWriter writer = null;try {writer = new BufferedWriter(new FileWriter("test.txt"));//写一行数据writer.write("helloworld");//换行writer.newLine();writer.write("helloworld");writer.flush();} catch (IOException e) {e.printStackTrace();} finally {//资源关闭if(writer != null){try {writer.close();} catch (IOException e) {e.printStackTrace();}}}}
}
test.txt
1.2 换一种方式
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class IODemo1{public static void main(String[] args) {//创建一个文件File file = new File("test.txt");Writer writer = null;try {//IO流是需要关闭的,如果不这样设计就会不能关闭资源writer = new FileWriter(file);writer.write("HelloWorld");} catch (IOException e) {e.printStackTrace();}finally {//判断writer不是空防止空指针异常if(writer != null) {try {//关闭流writer.close();} catch (IOException e) {e.printStackTrace();}}}}}
1.3 追加数据
import java.io.IOException;
import java.io.Writer;
import java.io.FileWriter;
import java.io.File;public class IOTest4 {public static void main(String[] args) {Writer writer = null;try {//IO流是需要关闭的,如果不这样设计就会不能关闭资源//writer = new FileWriter("test1.txt", true);writer = new FileWriter(new File("test.txt"), true);writer.write("liangliang");} catch (IOException e) {e.printStackTrace();}finally {//判断writer不是空防止空指针异常if(writer != null) {try {//在关闭前会做flush的事情writer.close();} catch (IOException e) {e.printStackTrace();}}}}
}
1.4 写很多数据,记得要清一下缓存
import java.io.IOException;
import java.io.Writer;
import java.io.FileWriter;
import java.io.File;public class IOTest5 {public static void main(String[] args) {//创建一个文件File file = new File("test.txt");Writer writer = null;try {//IO流是需要关闭的,如果不这样设计就会不能关闭资源writer = new FileWriter(file);for (int i = 0; i < 100; i++) {writer.write("HelloWorld\r\n");//每次写入10个helloworld的时候做一次flushif(i % 10 == 0){writer.flush();}}} catch (IOException e) {e.printStackTrace();}finally {//判断writer不是空防止空指针异常if(writer != null) {try {//在关闭前会做flush的事情writer.close();} catch (IOException e) {e.printStackTrace();}}}}
}
1.5 用数组、字符串写入
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class IOTest6 {public static void main(String[] args) {//创建一个文件File file = new File("test.txt");Writer writer = null;try {writer = new FileWriter(file);//定义一个数组char[] c = {'a','b','p','b','p'};/*writer.write(c);//把数组中的一部分写入文件writer.write(c, 2, 2);writer.write(97);*/writer.write("helloworld", 2, 2);} catch (IOException e) {e.printStackTrace();}finally {if(writer != null) {try {writer.close();} catch (IOException e) {e.printStackTrace();}}}}}
2. Reader
Reader是所有字符输入流的父类,它是一个抽象类,用于读取字符数据。与InputStream不同,Reader操作的是字符,适用于文本文件的读取。
Java提供了多种Reader的实现类,例如:
- FileReader:用于从文件中读取字符数据。
- CharArrayReader:从字符数组中读取数据。
- BufferedReader:提供缓冲功能,提高读取效率。
- StringReader:从字符串中读取数据。
举几个例子:
2.1 读个文件
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;public class BufferReaderDemo {public static void main(String[] args) {BufferedReader reader = null;try{reader = new BufferedReader(new FileReader("IO操作/CopyDemo1.java"));String line = null;while((line = reader.readLine()) != null){System.out.println(line);}}catch(Exception e){e.printStackTrace();}finally{if(reader != null){try{reader.close();}catch(IOException e){e.printStackTrace();}}}}
}
2.2 读取字符
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;public class ReaderDemo {public static void main(String[] args) {Reader reader = null;File file = new File("test.txt");try{//创建出入流对象FileReaderreader = new FileReader(file);//读取数据, 读取的字符被转换成了ascii 单个字符读取int c = reader.read();System.out.println((char)c);c = reader.read();System.out.println((char)c);//如果读取到的是-1后面就没有字符了c = reader.read();System.out.println(c);}catch(Exception e){e.printStackTrace();}finally{//关闭资源if(reader != null){try {reader.close();} catch (IOException e) {e.printStackTrace();}}}}
}
2.3 读取数据到数组
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Arrays;public class ReaderDemo2 {public static void main(String[] args) {File file = new File("test.txt");Reader reader = null;try {//创建出入流对象FileReaderreader = new FileReader(file);//定义一个数组 字符 charchar[] cs = new char[5];//向字符数组中填数据int len = reader.read(cs);System.out.println("读取的长度:"+len+" 读取的内容:"+ Arrays.toString(cs) + ",,,");//本次读取的字符的长度,如果要是文件中没有数据了,读取到的是-1len = reader.read(cs);System.out.println("第二次读取的长度:"+len+" 读取的内容:"+ Arrays.toString(cs) + ",,,");len = reader.read(cs);System.out.println("第三次读取的长度:"+len+" 读取的内容:"+ Arrays.toString(cs) + ",,,");} catch (Exception e) {e.printStackTrace();} finally {//关闭资源if(reader != null){try {reader.close();} catch (IOException e) {e.printStackTrace();}}}}
}
练习一下:
2.4 复制文件
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.Reader;
import java.io.Writer;public class Test {public static void main(String[] args) {Reader reader = null;Writer writer = null;File file = new File("IO操作/ReaderDemo.java");File fileX = new File("IO操作/ReaderDemoX.java");// 写入文件try{// 读取reader = new FileReader(file);writer = new FileWriter(fileX);String str = "";char[] chars = new char[1024];int len = -1;while((len = reader.read(chars)) != -1){writer.write(chars, 0, len);}}catch(Exception e){e.printStackTrace();}finally{try{reader.close();writer.close();}catch(Exception e){e.printStackTrace();}}}
}
3. InputStream
InputStream是Java IO库中的一个重要抽象类,它用于从字节输入流中读取数据。以下是关于InputStream的详细解释:
基本概念:
- InputStream是所有字节输入流的超类,用于读取诸如图像、视频、文本等各种类型的文件或其他数据源中的数据。
- 它是一个抽象类,定义了读取字节数据的方法,但具体的实现依赖于它的子类。
常见实现类:
- FileInputStream:从文件中读取数据。
- ByteArrayInputStream:从字节数组中读取数据。
- BufferedInputStream:提供缓冲功能,提高读取效率。
- DataInputStream:用于读取Java的基本数据类型。
基本方法:
- read():从输入流中读取下一个字节的数据,并以整数形式返回。如果已经达到流的末尾,则返回-1。
- read(byte[] b):从输入流中读取一些字节的数据,并将其存储到指定的字节数组b中。返回实际读取的字节数。
- read(byte[] b, int off, int len):从输入流中读取最多len个字节的数据,并将其存储到指定的字节数组b中,从偏移量off开始。返回实际读取的字节数。
- skip(long n):跳过并丢弃输入流中的n个字节数据。返回实际跳过的字节数。
- available():返回从此输入流中可以读取(或跳过)而不会阻塞的字节数的估计值。此方法通常返回0。
- close():关闭输入流并释放与该流关联的系统资源。
注意事项:
- 在使用完InputStream后,应该调用close()方法来关闭流并释放系统资源。可以使用try-with-resources语句来自动关闭流。
- 在处理字节流时,需要特别注意字符编码问题。如果需要处理文本数据,可能需要结合使用InputStreamReader来将字节流转换为字符流。
举例:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;public class IOByteInputDemo {public static void main(String[] args) {InputStream in = null;try {//创建一个字节的数组byte[] bs = new byte[1024];//创建字符输入流的对象,如果有中文有可能出现乱码in = new FileInputStream("test.txt");//定义读取到的长度的标识int len = -1;while((len = in.read(bs)) != -1){String s = new String(bs, 0 , len);System.out.print(s);}} catch (Exception e) {e.printStackTrace();} finally {if(in != null){try {in.close();} catch (IOException e) {e.printStackTrace();}}}}
}
4. OutputStream
OutputStream 是 Java I/O 库中用于写入字节数据到目的地的抽象类。它定义了字节输出的基本方法,具体的实现细节则由它的子类来提供。以下是关于 OutputStream 的详细解释:
基本概念:
- OutputStream 是所有字节输出流的超类。当你需要将字节数据写入文件、网络连接或其他输出设备时,你可以使用 OutputStream 或其子类。
常见实现类:
- FileOutputStream:用于将数据写入文件。
- ByteArrayOutputStream:将数据写入内存中的字节数组。
- BufferedOutputStream:提供缓冲功能,以优化写入性能。
- DataOutputStream:允许写入 Java 基本数据类型到输出流中。
基本方法:
- write(int b):将指定的字节写入此输出流。
- write(byte[] b):将 b.length 个字节从指定的字节数组写入此输出流。
- write(byte[] b, int off, int len):从指定的字节数组写入 len 个字节,从偏移量 off 开始。
- flush():刷新此输出流并强制写出任何被缓冲的输出字节。
- close():关闭此输出流并释放与此流相关联的任何系统资源。
注意事项:
- 在使用完 OutputStream 后,应该调用 close() 方法来关闭流并释放系统资源。可以使用 try-with-resources 语句来自动关闭流。
- 当你使用 BufferedOutputStream 或其他具有缓冲的 OutputStream 子类时,即使你不显式调用 flush() 方法,在关闭流时(例如通过 try-with-resources 语句)也会自动刷新缓冲区。但是,在某些情况下,你可能希望显式地刷新缓冲区以确保数据被立即写出。
- 在处理字节流时,如果源数据是文本,你可能需要考虑字符编码问题。如果需要将文本数据写入输出流,你可能需要结合使用 OutputStreamWriter 将字符流转换为字节流,并指定字符编码。
举例:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class IOByteDemo {public static void main(String[] args) {//创建字节输出流OutputStream out = null;try {out = new FileOutputStream(new File("test.txt"));//字节流不需要flushbyte[] bs = {97, 99, 108, 111};out.write(bs);// out.write(97);} catch (Exception e) {e.printStackTrace();} finally {try {if(out != null){out.close();}} catch (IOException e) {e.printStackTrace();}}}
}
5. 参考链接
【java】IO流-1(OutputStream和Writer)
相关文章:

字节流和字符流的相关知识
目录 1. Writer1.1 写两行数据1.2 换一种方式1.3 追加数据1.4 写很多数据,记得要清一下缓存1.5 用数组、字符串写入 2. Reader2.1 读个文件2.2 读取字符2.3 读取数据到数组2.4 复制文件 3. InputStream4. OutputStream5. 参考链接 1. Writer Writer类是Java.io包中…...

LLM意图识别器实践
利用 Ollama 和 LangChain 强化条件判断语句的智能提示分类 ❝ 本文译自Supercharging If-Statements With Prompt Classification Using Ollama and LangChain一文,以Lumos工具为例,讲解了博主在工程实践中,如何基于LangChain框架和本地LLM优…...

常见的反爬手段和解决思路(爬虫与反爬虫)
常见的反爬手段和解决思路(爬虫与反爬虫) 学习目标1 服务器反爬的原因2 服务器长反什么样的爬虫(1)十分低级的应届毕业生(2)十分低级的创业小公司(3)不小心写错了没人去停止的失控小…...

Stable Diffusion【真人模型】:人像光影摄影极限写实真实感大模型
大家好,我是极客菌 今天和大家分享一个基于SD1.5的真人大模型:人像光影摄影极限写实真实感大模型。 该模型具有以下特点: 真实肤感(在面部肌理和皮肤肌理上均有加强学习,拒绝ai出图假的问题) 永不脱妆&a…...

java实现图片添加水印
文章目录 前言一、工具类WatermarkUtil二、工具类介绍2.1 图片来源类型2.2 水印类型2.3 读取本地图片2.4 读取网络图片2.5 水印处理2.6 添加水印 三、测试添加水印总结 前言 给图片添加水印是一个很常见的需求,一般是用来防盗用。比如我们csdn上面写的文章中&#…...

CSS规则——font-face
font-face 什么是font-face? 想要让网页文字千变万化,仅靠font-family还不够,还要借助font-face(是一个 CSS 规则,它允许你在网页上使用自定义字体,而不仅仅是用户系统中预装的字体。这意味着你可以通过提…...

【单片机毕业设计选题24034】-基于STM32的手机智能充电系统
系统功能: 系统可以设置充电时长,启动充电后按设置的充电时长充电,充电时间到后自动 停止充电,中途检测到温度过高也会结束充电并开启风扇和蜂鸣器报警。 系统上电后,OLED显示“欢迎使用智能充电系统请稍后”,两秒钟…...

[C++][数据结构][图][中][图的遍历][最小生成树]详细讲解
目录 1.图的遍历1.广度优先遍历2.深度优先遍历 2.最小生成树1.Kruskal算法2.Prim算法 1.图的遍历 给定一个图G和其中任意一个顶点 v 0 v_0 v0,从 v 0 v_0 v0出发,沿着图中各边访问图中的所有顶点,且每个顶 点仅被遍历一次 “遍历”&…...

退市新规解读—财务类强制退市
一、退市风险警示:第一年触及相关指标 上市公司最近一个会计年度触及下列退市风险指标之一,公司股票或存托凭证被实施退市风险警示(*ST): 第1项 组合类财务指标 仅发行A股或B股,最近一个会计年度或追溯重述后最近一个会计年度 …...

小程序的生命周期使用方法和应用场景
小程序生命周期 初始化(App Launch) • 触发时机:小程序首次启动时。 • 主要事件:onLaunch。 • 功能与适用场景: • 全局数据初始化:设置应用的全局状态和变量。 • 登录状态检查:判断用户是…...

什么是C++模块化系统?C++20的模块化系统。
C20引入的模块化系统是一种新的代码组织和编译机制,它旨在替代传统的头文件机制,提供更好的代码组织、更快的编译速度和更强的封装性。模块化系统的主要目标包括: 减少编译时间:通过减少冗余的头文件解析和宏定义传播,…...

智慧校园-档案管理系统总体概述
智慧校园档案管理系统,作为教育信息化进程中的重要一环,它运用现代信息技术的力量,彻底改变了传统档案管理的面貌,为学校档案资源的收集、整理、存储、检索与利用开辟了全新的途径。这一系统全面覆盖学生、教职工、教学科研及行政…...

文心一言 VS 讯飞星火 VS chatgpt (290)-- 算法导论21.3 3题
三、给出一个包含 m 个 MAKE-SET 、UNION 和 FINDSET 操作的序列(其中有 n 个是 MAKE-SET 操作),当仅使用按秩合并时,需要 Ω(mlgn) 的时间。如果要写代码,请用go语言。 文心一言: 在并查集(Union-Find)数…...

逻辑回归梯度推导
逻辑回归是一种广泛使用的分类算法,用于估计一个事件发生的概率。它是线性回归的扩展,通过sigmoid函数将线性回归的输出映射到[0, 1]区间,从而用于分类任务。 在逻辑回归中,我们使用对数似然损失函数(log-likelihood l…...

Python 使用函数输出一个整数的逆序数
在Python中,你可以定义一个函数来输出一个整数的逆序数。这里有一个简单的实现方法: def reverse_integer(x):# 检查输入是否为整数if not isinstance(x, int):raise ValueError("Input must be an integer")# 将整数转换为字符串,…...

【Linux】Wmware Esxi磁盘扩容
目录 一、概述 1.1 磁盘分区概念 1.2 LVM概念 二、扩容步骤 二、报错 一、概述 1.1 磁盘分区概念 在 Linux 中,每一个硬件设备都映射到一个系统的文件,对于硬盘、光驱等 IDE 或 SCSI 设备也不例外。Linux把各种 IDE 设备分配了一个由 hd 前缀组成的文…...

树莓派4B_OpenCv学习笔记15:OpenCv定位物体实时坐标
今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1: 今日学习 OpenCv定位物体实时位置,代码来源是…...

MySQL之如何定位慢查询
1、如何定位慢查询 1.1、使用开源工具 调试工具:Arthas 运维工具:Promethuss、Skywalking 1.2、MySQL自带慢日志 慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒&#x…...

Open3D 删除点云中重复的点
目录 一、算法原理1、重叠点2、主要函数二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、重叠点 原始点云克隆一份 构造重叠区域 合并点云获得重叠点 2、主要…...

填报志愿选专业是兴趣重要还是前景重要?
进行专业评估,找到一个适合自己的专业是一件非常困难的事情。在进行专业选择时,身上理想化色彩非常严重的人,会全然不顾及他人的劝阻,义无反顾的以兴趣为主,选择自己热爱的专业。一些较多考虑他人建议,能听…...

python开发基础——day9 函数基础与函数参数
一、初识函数(function) 编程函数!数学函数,里面的是逻辑,功能,而不是套公式 编程函数的作用实现特定操作的一段代码 你现在请客,每个人都点同样的一份吃的,请100个人 1.薯条 2.上校鸡块 3.可乐 那…...

STM32——使用TIM输出比较产生PWM波形控制舵机转角
一、输出比较简介: 只有高级定时器和通用寄存器才有输入捕获/输出比较电路,他们有四个CCR(捕获/比较寄存器),共用一个CNT(计数器),而输出比较功能是用来输出PWM波形的。 红圈部分…...

第十五章 集合(set)(Python)
文章目录 前言一、集合 前言 集合(set)是一个无序的不重复元素序列。 一、集合 set {1, 2, 3, 4}...

面试-javaIO机制
1.BIO BIO:是传统的javaIO以及部分java.net下部分接口和类。例如,socket,http等,因为网络通信同样是IO行为。传统IO基于字节流和字符流进行操作。提供了我们最熟悉的IO功能,譬如基于字节流的InputStream 和OutputStream.基于字符流…...

在.NET Core中,config和ConfigureServices的区别和作用
在.NET Core中,config和ConfigureServices是两个不同的概念,它们在应用程序的启动和配置过程中扮演着不同的角色。 ConfigureServices:这是ASP.NET Core应用程序中的一个方法,位于Startup类的内部。它的作用是配置依赖注入(DI)容器…...

App Inventor 2 如何实现多个定时功能?
1、可以使用多个“计时器”组件。 2、也可以用一个计时器,定时一分钟。也就是一分钟就会触发一次事件执行,定义一个全局数字变量,在事件中递增,用逻辑判断这个变量的值即可完成多个想要定时的任务(о∀о) 代码块请参考…...

技术驱动的音乐变革:AI带来的产业重塑
📑引言 近一个月来,随着几款音乐大模型的轮番上线,AI在音乐产业的角色迅速扩大。这些模型不仅将音乐创作的门槛降至前所未有的低点,还引发了一场关于AI是否会彻底颠覆音乐行业的激烈讨论。从初期的兴奋到现在的理性审视࿰…...

重生之我要学后端0--HTTP协议和RESTful APIs
http和RESTful APIs HTTP协议RESTful APIs设计RESTful API设计实例 HTTP协议 HTTP(超文本传输协议)是用于分布式、协作式和超媒体信息系统的应用层协议。它是网页数据通讯的基础。工作原理简述如下: 客户端请求(Request…...

深度之眼(二十八)——神经网络基础知识(三)-卷积神经网络
文章目录 一、前言二、卷积操作2.1 填充(padding)2.2 步长2.3 输出特征图尺寸计算2.4 多通道卷积 三、池化操作四、Lenet-5及CNN结构进化史4.1 Lenet-5 一、前言 卷积神经网络–AlexNet(最牛)-2012 Lenet-5-大规模商用(1989) 二、…...

AI Infra简单记录
向量数据库的作用 1. 在AI大模型训练过程中,向量数据库可以有效提升数据检索、特征提取等任务的效率。 2、在AI大模型推理过程中,向量数据库为大模型提供外挂知识库,提升模型时效性与准确性,提供缓存能力,减少调用开…...