字节流和字符流的相关知识
目录
- 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、主要…...

填报志愿选专业是兴趣重要还是前景重要?
进行专业评估,找到一个适合自己的专业是一件非常困难的事情。在进行专业选择时,身上理想化色彩非常严重的人,会全然不顾及他人的劝阻,义无反顾的以兴趣为主,选择自己热爱的专业。一些较多考虑他人建议,能听…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...