理解Java字节流与字符流的区别与联系 _07

5060TI显卡深度学习环境搭建:CUDA12.8与CUDNN9.8.0的完美搭配 本文详细介绍了在Win10系统下为5060TI显卡搭建深度学习环境的最佳实践,重点配置CUDA12.8与CUDNN9.8.0的完美组合。通过优化OpenCV编译选项和YOLOv5环境设置,显著提升模型训练和推理效率,帮助开发者充分发挥5060TI显卡的性能潜力。 阅读详情

Java中的“流”是什么?

    一个Java I/O对象叫做数据流。读取数据到内存的对象叫做输入流,内存写出数据的对象叫做输出流。

针对其面向的不同角度,可以将流分为下面几种类型:

按照数据流的方向不同分为输入流和输出流。这种分类不是绝对的,例如在向一个文件写入数据时,它就是输出流;而在读取数据时,它就是输入流。

按照处理数据的单位不同分为字节流和字符流。表示以字节为单位从stream中读取或往stream中写入信息,通常用来读取二进制数据。字符流:以Unicode字符为单位从stream中读取或往stream中写入信息。

按照功能的不同分为节点流和处理流。节点流是从特定的数据节点(文件、数据库、内存等)读写数据;处理流是连接在已有的流上,通过对数据的处理为程序提供更多功能。


将流分为字节流和字符流,Java中流的层级结构可以通过下图来表示:蓝色是抽象类,绿色是具体类。


字节流在操作时本身不会用到缓冲区(内存),是在文件本身直接操作的;而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如图。


通过下面的字节流输出代码和字符流的输出代码可以更好的理解这一点。

import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
public class TestOutputStream
{
	public static void main(String[] args) throws Exception //异常直接抛出,不处理
	{
		File f = new File("d:" + File.separator + "test.txt"); //File.separaor是文件路径分隔符
		OutputStream out = new FileOutputStream(f);//通过子类实例化父类对象,OutputStream是抽象类
		String str = "Hello World!!!";//准备一个字符串
		byte b[] = str.getBytes();//将字符串转为byte数组
		out.write(b);//将byte数组的内容输出	
		//此时并没有用out.clase()关闭输出流
	}
}

可以在d盘根目录看到test.txt文件,打开发现

即使此时没有关闭字节流操作,但是文件中也依然存在了输出的内容,证明字节流是直接操作文件本身的。而下面继续使用字符流完成,再观察效果。(先把test.txt文件删除)

import java.io.File;
import java.io.Writer;
import java.io.FileWriter;
public class TestWriter
{
	public static void main(String[] args) throws Exception //异常直接抛出,不处理
	{
		File f = new File("d:" + File.separator + "test.txt"); //File.separaor是文件路径分隔符
		Writer out = new FileWriter(f);//通过子类实例化父类对象,Writer是抽象类
		String str = "Hello World!!!";//准备一个字符串
		out.write(str);
		//此时依旧没有用out.clase()关闭输出流
	}
}

依然可以在d盘根目录看到test.txt文件,不过打开发现里面是空的,并没有“Hello World”; 

这是因为字符流操作时使用了缓冲区,而在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区中的内容是无法输出的。所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。


如何理解缓冲区这个词?

缓冲区可以简单地理解为一段内存区域。可以简单地把缓冲区理解为一段特殊的内存。
某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。
在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。
如果想在不关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush( )方法完成。如下面的代码:

import java.io.File;
import java.io.Writer;
import java.io.FileWriter;
public class TestWriterFlush
{
	public static void main(String[] args) throws Exception //异常直接抛出,不处理
	{
		File f = new File("d:" + File.separator + "test.txt"); //File.separaor是文件路径分隔符
		Writer out = new FileWriter(f);//通过子类实例化父类对象,Writer是抽象类
		String str = "Hello World";//准备一个字符串
		out.write(str);//将内容输出
		out.flush();//强制性清空缓冲区的内容,将缓冲区的内容全部。
		//没有用out.clase()关闭输出流
	}
}

运行结果如下:

此时,文件中已经存在了内容,更进一步证明内容是保存在缓冲区的。


在开发中如何选择字节流或字符流?

所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。

字节流与字符流主要的区别是他们的处理方式。字节流是最基本的,主要用在处理二进制数据,它是按字节来处理的。但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化。这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[ ]和String来关联。

在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的。在从字节流转化为字符流时,实际上就是byte[ ]转化为String时,public String(byte bytes[ ], String charsetName),有一个关键的参数字符集编码,通常我们都省略了,那系统就用操作系统的lang,而在字符流转化为字节流时,实际上是String转化为byte[]时,byte[ ]    String.getBytes(String charsetName)也是一样的道理

至于java.io中还出现了许多其他的流,按主要是为了提高性能和使用方便,如BufferedInputStream,PipedInputStream等。


人形机器人触觉革命:压电式电子皮肤的多模态感知与自修复技术突破 本文深入探讨了压电式电子皮肤如何推动人形机器人的触觉革命。文章分析了其基于压电效应的多模态感知原理,能够灵敏检测压力、振动与温度,并重点介绍了赋予电子皮肤自修复能力的动态共价网络等前沿材料技术,从而极大提升了机器人与物理世界进行精细、安全交互的可靠性与智能化水平。 阅读详情

相关推荐

手把手教你自制Type-C OTG转换器(附电路图及避坑指南)

本文详细指导如何自制Type-C OTG转换器,包括核心电路设计、元器件选型及焊接技巧,特别强调硬件检测电路的关键作用。通过实测数据和避坑指南,帮助开发者解决兼容性问题,实现高效数据传输。

weixin_27038245的博客 713

字节流和字符流

字节流和字符流

weixin_42594143的博客 3451

同花顺【红绿趋势】幅图指标 源码分析

a10:IF(差值<=0 ,0 ,差值*0.2 ,4 ,0),STICK,linethick5,colorred;a7:IF(差值<=0 ,0 ,差值*0.8 ,4 ,0),STICK,linethick5,colorred;a8:IF(差值<=0 ,0 ,差值*0.6 ,4 ,0),STICK,linethick5,colorred;a6:IF(差值<=0 ,0 ,差值*1 ,4 , 0),STICK,linethick5,colorred;DRAWICON(先锋<0,-25,1);

zhibiaogong的博客 4061

10、Java中字节流和字符流的区别与联系。

小景哥哥博客 Java中字节流和字符流的区别与联系。 字节流按8位传输,以字节为单位输入输出数据;字符流按16位传输,以字符为单位输入输出数据。 字节流读取的时候,读到一个字节就返回一个字节; 字符流使用了字节流读到一个或多个字节(中文对应的字节 数是两个,在UTF-8码表中是3个字节)时,先去查指定的编码表,将查到的字符返回。 字节流可以处理所有类型数据,如:MP3、AVI视频文件、图片,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。字节流主要是操作byte类

JingLisen的博客 693

Lakes.AERMOD.View.v8.9.0 1CD大气扩散模型软件包

Lakes.AERMOD.View.v8.9.0 1CD大气扩散模型软件包 Lakes Environmental ARTM View v1.4.2 1CD放射物扩散模拟模型 Aermod View是一套完整的、功能强大的大气扩散模型软件包,并将美国EPA指定的大气扩散模型(如下)完美的集成成为一个综合的操作平 台: - AERMOD 电话TEL:18980583122  客服 QQ:11

yyii0000的博客 4001

MINI PCIE接口设计要点:

3.3Vaux(5pins):3.3V电源。PERST#信号通过外接复位电路,可实现模块复位。模块可以通过硬件方式或软件方式关闭射频通信(不包括 GNSS)。LED_WWAN#:(O)漏极开漏,低有效。:(I)低激活系统禁止射频信号(飞行模式),因此需加上拉。UIM_PWR (1 pin):(O)UIM的电源输出。SMB_DATA:SMBus2.0数据信号线。UIM_VPP:(O)A类设备的可变电源电压。SMB_CLK:SMBus2.0时钟信号线。UIM_RESET:(O)UIM的复位信号。

qq_40010777的博客 8240

java中的字节流与字符流

java中关于字节流与字符流的区分

weixin_44069475的博客 1891

FMC/FSMC/EXMC总线NORFlash/PSRAM接口(异步-复用-不突发/同步-复用-突发)

目录 1 简介 1.1 框图 1.2 接口定义 1.3 读写时序图、时序配置参数 1.4 PSRAM控制器异步工作模式分类 1.5 PSRAM寄存器配置 1.5.1 控制寄存器BCR 1.5.2 片选时序寄存器BTR 1.5.3 写入时序寄存器BWTR 2 FPGA接口设计 2.1 实际配置的时序 2.2 接口信号处理 3 参考文献 1 简介 使...

leixj的博客 2万+

字符流 字节流

先来看一下流的概念: 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。 程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。 字节流与字符流 在java.io包中操作文件内容的主要有两大类:字节流、字符流,两类都分为输入和输出操作。在字节流中输出数据主要是使用Ou...

weixin_30262255的博客 748

第一节:初识n8n与下一代工作流自动化

本章介绍了n8n的Fair-code理念与节点式架构,对比了其与Zapier/Make的核心差异,并引导读者在n8n Cloud上完成首次界面导览,建立了工作流自动化的宏观认知。

easeyoo的专栏 105

人工智能训练师三级考试大纲深度解读|理论+实操分值分布+六大模块占比

三级人工智能训练师考试分为理论和实操两大模块(各100分,合格线60分)。理论考试包含AI基础(30%)、数据标注(25%)、模型训练(20%)、测试(15%)和系统运维(10%),题型为客观题;实操考核侧重数据标注(40%)、模型测试(35%)和系统运维(25%),采用现场操作形式。复习应优先关注AI基础和数据标注等高分值模块,实操需重点掌握标准流程和结果准确性(占评分70%)。考试要求两模块均达标,理论侧重概念理解,实操强调规范执行与文档完整。

白话机器学习 1097

【转】理解Java字节流与字符流的区别与联系

Java中的“流”是什么? 一个Java I/O对象叫做数据流。读取数据到内存的对象叫做输入流,内存写出数据的对象叫做输出流。 针对其面向的不同角度,可以将流分为下面几种类型: 按照数据流的方向不同分为输入流和输出流。这种分类不是绝对的,例如在向一个文件写入数据时,它就是输出流;而在读取数据时,它就是输入流。 按照处理数据的单位不同分为字节流和字符流。表示以字节为单位从stream中读取或往stream中写入信息,通常用来读取二进制数据。字符流:以Unicode字符为单位从stream中读取...

阿浪的专栏 469

飞牛fnNAS虚拟机开启OVS导致失联的解决

摘要:用户在使用飞牛NAS时发现开启OVS网络功能后导致NAS失联。通过多种尝试(包括开关OVS、更换系统版本、手工配置、更换网卡、处理器检查等)后发现,OVS启用状态下DHCP无法获取IP地址,手动设置IP可暂时恢复网络。但重启后问题依旧,初步判断为OVS功能存在bug。目前临时解决方案是在需要时手动开关OVS,或考虑其他虚拟化方案。用户计划后续探索替代方案,并等待官方修复该问题。

dgnankai的专栏 4334

字节流与字符流的区别

在Java的I/O(输入输出)操作中,字节流(Byte Streams)和字符流(Character Streams)是两个重要的概念。虽然它们都可以用来处理数据的输入输出,但是它们之间还是存在显著的区别。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 7768

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java 字节流与字符流的区别

字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如图12-6所示。 下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流。 范例:使用字节流不关闭执行 程序运行结果: 此时没有关闭字节流操作,但是...

要啥名字 5223

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java中字符流和字节流的区别_java中字节流和字符流有哪些区别

java中字节流和字符流的区别有:1、定义不同;2、结尾不同;3、处理方式不同;4、缓冲区不同;5、编码方式不同。字节流默认不使用缓冲区,而字符流使用缓冲区。字节流采用ASCII编码,字符流采用unicode编码。流是一系列随时间而可用的数据;源将数据生成为流,目标消耗或读取数据可用作流。换句话说,流解释了允许读或写的数据流。在Java中执行流操作的两种方式是使用字节流和字符流。下面我们就来简单了...

weixin_42699679的博客 6436

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

字节流与字符流的区别详解

字节流与字符流 先来看一下流的概念: 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。 程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。 字节流与字符流 在java.io包中操作文件内容的主要有两大类:字节流、字符流,两类都分为输入和输出操作。在字

Never_Drop 3178

Java中字符流和字节流的区别

在 Java 的 I/O 体系中,字节流和字符流都配备了缓冲机制的实现类,以此显著提升数据读写的效率。在 Java 编程实践中,最佳实践是:使用字符流读取文本文件,使用字节流读取非文本文件。

2202_75481735的博客 1215

Java 字节流与字符流的总结和理解

常用流的介绍Java 输入输出流中主要有几个重要的类,掌握了这几种,其他的流可以类比学习。 下面就着重学习以下的类: ***Inputstream Outputstream FileInputstream FileOutputstream Reader Writer FileReader FileWriter InputStreamReader OutputStream

学海无涯乐作舟 4870

java字符流和字节流的区别_java字符流与字节流的区别是什么

java中字符流与字节流的区别:1、字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。2、字节流默认不使用缓冲区;字符流使用缓冲区。3、字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。字节流Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据。...

weixin_42500130的博客 1060

java中什么是字节流和字符流_理解 Java 中字节流与字符流的区别

什么是流Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列。和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序列的对象被称为输入流;能够向其写入一个字节序列的对象被称为输出流。字节流Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据。Java中最基本的两个字节流类是InputStream和Outp...

weixin_34944897的博客 806

理解Java中字符流与字节流的区别

1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列。和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序列的对象被称为输入流;能够向其写入一个字节序列的对象被称为输出流。 2. 字节流 Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据。Java中最基本的两个字节流类是InputStream和OutputStream,它们分别代表了组基本的输入字节流和输出字节流。InputStream类与Ou

DDDDeng_的博客 367

java中字节流与字符流的区别

1.概念 1.Java中的流是对字节序列的抽象,对于数据的输入/输出操作都是以“流”的方式进行。 2.流具有方向性的,至于是输入流还是输出流则是一个相对的概念,一般以程序为参考,如果数据的流向是程序至设备,则为输出流,反之称为输入流。 2.分类 可以从不同的角度对流进行分类: 1.处理的数据单位不同,可分为:字符流,字节流 2.数据流方向不同,可分为:输入流,输出流 3.功能不同,可分为:节点流,处理流 本次主要是理解字符流和字节流的概念和区别 3.字符流和字节流的概念 1.字符流 基本单位为字节,也就是8

weixin_46591962的博客 751

Java字节流和字符流的区别?

字符流:就是在字节流的基础上,加上编码,形成的数据流 字符流出现的意义:因为字节流在操作字符时,可能会有中文导致的乱码,所以由字节流引申出了字符流。 程序中所有的数据都是以流的方式进行传输或保存的,字节流主要操作type类型的数据,以type数组为准。 java中字节流与字符流的区别: 1、读写的时候一个是按字节读写,一个是按字符。 2、在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流。只是读写文件,和文件内容无关的,一般选择字节流。 3、以stream结尾都是字节流,r

ZhaZha__Hui的博客 2032
上一篇: PAT乙级Java实现_1012. 数字分类 _附详细解题注释_12
下一篇: Java I/O基础框架_08
coder__666
博客等级 码龄9年 42粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值