Java字节流与字符流的区别

2023-11-10

字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?

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

下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流。

范例:使用字节流不关闭执行
Java代码  收藏代码
  1. package org.lxh.demo12.byteiodemo; 
  2.    
  3. import java.io.File;    
  4. import java.io.FileOutputStream;    
  5. import java.io.OutputStream;    

  6. public class OutputStreamDemo05 {    

  7. public static void main(String[] args) throws Exception {  // 异常抛出,  不处理    
  8. // 第1步:使用File类找到一个文件    
  9.      File f = new File("d:" + File.separator + "test.txt"); // 声明File  对象    
  10. // 第2步:通过子类实例化父类对象    
  11.      OutputStream out = null;        // 准备好一个输出的对象    
  12.      out = new FileOutputStream(f);  // 通过对象多态性进行实例化   
  13. // 第3步:进行写操作    
  14.      String str = "Hello World!!!";  // 准备一个字符串    
  15.      byte b[] = str.getBytes();      // 字符串转byte数组    
  16.      out.write(b);                  // 将内容输出   
  17.     
  18.  // 第4步:关闭输出流    
  19.     // out.close();                  // 此时没有关闭
  20.     
  21.         }    
  22.     }   
程序运行结果:

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

范例:使用字符流不关闭执行
Java代码  收藏代码
  1. package org.lxh.demo12.chariodemo; 
  2.    
  3. import java.io.File;    
  4. import java.io.FileWriter;    
  5. import java.io.Writer;    

  6. public class WriterDemo03 {    

  7.     public static void main(String[] args) throws Exception { // 异常抛出,  不处理    
  8.         // 第1步:使用File类找到一个文件    
  9.         File f = new File("d:" + File.separator + "test.txt");// 声明File 对象    
  10.         // 第2步:通过子类实例化父类对象    
  11.         Writer out = null;             // 准备好一个输出的对象            
  12.         out = new FileWriter(f);       // 通过对象多态性进行实例化       
  13.         // 第3步:进行写操作    
  14.         String str = "Hello World!!!"// 准备一个字符串     
  15.         out.write(str);                // 将内容输出    
  16.         // 第4步:关闭输出流    
  17.         // out.close();                // 此时没有关闭    
  18.     }    
  19. }   
程序运行结果:


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


提问:什么叫缓冲区?

在很多地方都碰到缓冲区这个名词,那么到底什么是缓冲区?又有什么作用呢?

回答:缓冲区可以简单地理解为一段内存区域。

可以简单地把缓冲区理解为一段特殊的内存。

某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。

在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。

如果想在不关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush()方法完成。

范例:强制性清空缓冲区

Java代码  收藏代码
  1. package org.lxh.demo12.chariodemo;
  2.     
  3. import java.io.File;    
  4. import java.io.FileWriter;    
  5. import java.io.Writer;    

  6. public class WriterDemo04 {    
  7.     public static void main(String[] args) throws Exception { // 异常抛出不处理    
  8.         // 第1步:使用File类找到一个文件    
  9.         File f = new File("d:" + File.separator + "test.txt");// 声明File对象 
  10.         // 第2步:通过子类实例化父类对象    
  11.         Writer out = null;       // 准备好一个输出的对象            
  12.         out = new FileWriter(f);// 通过对象多态性进行实例化            
  13.         // 第3步:进行写操作    
  14.         String str = "Hello World!!!";  // 准备一个字符串    
  15.         out.write(str);                // 将内容输出   
  16.         out.flush();                    // 强制性清空缓冲区中的内容   
  17.         // 第4步:关闭输出流    
  18.         // out.close();                 // 此时没有关闭
  19.     
  20.     }    
  21. }   
程序运行结果:


此时,文件中已经存在了内容,更进一步证明内容是保存在缓冲区的。这一点在读者日后的开发中要特别引起注意。


提问:使用字节流好还是字符流好?

学习完字节流和字符流的基本操作后,已经大概地明白了操作流程的各个区别,那么在开发中是使用字节流好还是字符流好呢?

回答:使用字节流更好。

在回答之前,先为读者讲解这样的一个概念,所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。


字节流与字符流主要的区别是他们的的处理方式

流分类:
1.Java的字节流
   InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。
2.Java的字符流
  Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。
InputStream,OutputStream,Reader,writer都是抽象类。所以不能直接new 

字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的
但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的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等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java字节流与字符流的区别 的相关文章

  • Code::Blocks使用教程

    使用之前我们先准备一段代码 include lt stdio h gt include lt stdlib h gt int main printf 34 欢迎进入www dotcpp com编程网站 xff01 34 system 34
  • magento中在.htaccess设置website code

    在 htaccess中 xff0c 添加以下的内容 xff1a SetEnvIf Host www newjueqi com MAGE RUN CODE 61 newjueqi SetEnvIf Host www newjueqi com
  • npm安装vue报错:npm ERR! code ETIMEDOUT

    npm安装vue报错 信息如下 C span class token punctuation span Users span class token punctuation span Q span class token operator
  • VS CODE 页面没暂存/提交就放弃更改了怎么还原

    如图所示 xff0c 不小心手滑将还没有暂存的页面点了放弃更改 xff0c 过了两天才发现搞错了 xff0c 这时候怎么办呢 xff1f 不用担心 xff0c 找到这个页面 xff0c 直接ctrl 43 z可以还原回来 亲测有效
  • Visual Studio Code 使用Git进行版本控制

    Visual Studio Code 使用Git进行版本控制 本来认为此类教程 xff0c 肯定是满网飞了 今天首次使用VS Code的Git功能 xff0c 翻遍了 所有中文教程 xff0c 竟没有一个靠谱的 遂动笔写一篇 请确保你安装了
  • VS Code创建、调试ROS项目

    前言 xff1a 在vs code下配置ROS项目开发的环境 包括catkin创建编译工作空间 xff0c 创建ROS项目 xff0c 调试ROS节点 一 创建工作空间 首先创建一个cMake工作空间 xff0c 用到了catkin mak
  • Visual Studio和VS Code的区别

    1 Visual Studio简介 xff1a 是一个集成开发环境 IDE xff0c 安装完成后就能直接用 xff0c 编译工具 xff0c 调试工具 xff0c 各个语言的开发工具 xff0c 都是已经配置好的 xff0c 开箱即用 适
  • visual studio code中模拟浏览器端向服务端发起请求

    一 需要使用的插件 二 使用方式 1 创建 http文件 2 在所创建的 http文件中输入如下内容 相关具体的使用方式可参见 xff1a https marketplace visualstudio com items itemName
  • 报错{“msg“:“invalid token“,“code“:401}问题的解决

    报错 msg invalid token code 401 问题的解决 xff1a 解决办法 xff1a 将精确的路由放在最上面 xff0c 模糊的路由放在最下面 xff0c 防止精确的路由被覆盖
  • VS Code中C/C++ 无法跳转到定义的解决办法

    VS code的跳转功能一直很迷 xff0c 时好时坏 xff0c 有些新的工程环境干脆用不了 经过一遍遍的baidu加上自己的摸索 xff0c 总结出一套经验 xff0c 应该可以解决大部分的情况了 一 首先 xff0c 当然是安装插件了
  • 06.5 Code

    06 5 Code 推力 force 推力的应用旋翼的气动阻力空气阻力矩滚转力矩电机的转速 推力 force span class token comment force 61 电机的转速 xff5c 电机的转速 xff5c xff08 带
  • code的用法

    今天写程序的时候用了const xff0c 想到之前遇到的code的用法 xff0c 那是第一次遇到code的那样的用法 xff0c 查了一下 xff0c 解释如下 xff1a 在单片机使用C语言进行编程的时候 xff0c 经常使用到cod
  • 使用VS CODE+PlantUML高效画图

    使用VS CODE 43 PlantUML高效画图 自从发现了plantuml写脚本画图的方式之后 xff0c 爱上了画图 环境 xff1a MAC 前言 本文多数内容引用自官网文档和其他人的教程 xff0c 并非本人原创 xff0c 也谈
  • npm错误——npm ERR! code ERESOLVE 解决方法

    npm ERR code ERESOLVE npm ERR ERESOLVE unable to resolve dependency tree npm ERR npm ERR While resolving vol vue3 64 0 1
  • 键盘常用code码对照表

    功能键code值 字母和数字code值 常用控制键code值
  • vs2012编译boost_1_53_0

    Boost库的介绍 Boost库是一个经过千锤百炼 可移植 提供源代码的C 库 作为标准库的后备 是C 标准化进程的发动机之一 Boost库由C 标准委员会库工作组成员发起 其中有些内容有望成为下一代C 标准库内容 在C 社区中影响甚大 其
  • java内部类的作用分析

    提起Java内部类 Inner Class 可能很多人不太熟悉 实际上类似的概念在C 里也有 那就是嵌套类 Nested Class 关于这两者的区别与联系 在下文中会有对比 内部类从表面上看 就是在类中又定义了一个类 下文会看到 内部类可
  • IOU

    IOU 即交并比 应用 NMS 过滤重叠框 mAP import numpt as np def get IOU pred bbox gt bbox ixmin max pred bbox 0 gt bbox 0 iymin max pre
  • 下载google code中源码的几个工具

    Google code 一般以三种命令行方式提供源代码 格式如下 plain view plain copy hg clone https code google com p xxx git clone https code google
  • Golang实现一个事务型内存数据库

    内存数据库经我们经常用到 例如Redis 那么如何从零实现一个内存数据库呢 本文旨在介绍如何使用Golang编写一个KV内存数据库MossDB 特性 MossDB是一个纯Golang编写 可嵌入的 键值型内存数据库 包含以下特性 可持久化

随机推荐

  • Qt使用事件(event)与定时器实现字幕滚动

    目录 1 效果展示 2 实现思路 3 滚动窗口部件 3 1 成员变量 3 2 事件重写 3 3 成员方法 3 3 方法实现 1 效果展示 我们经常能够在外面看到那种滚动字幕 那么就拿qt来做一个吧 2 实现思路 实现一个窗口部件 这个窗口部
  • 一文彻底说清楚MySQL报1055 - SELECT list is not in GROUP BY incompatible with sql_mode=only_full_group_by的问题

    先说结论 这个问题根本原因是SQL不严谨造成的 由于5 7版本之前没有严格限制所以没有报错 但5 7之后默认进行了限制 需要DBA根据实际生产情况决定是忽略该错误 还是优化SQL解决该错误 如果是要忽略该错误 那么就把5 7版本加入的默认限
  • [python] Python枚举模块enum总结

    枚举是一种数据类型 在编程中用于表示一组相关的常量 枚举中的每个常量都有一个名称和一个对应的值 可以用于增强代码的可读性和可维护性 在Python中 枚举是由enum模块提供的 而不是Python提供专用的枚举语法 关于enum模块介绍见
  • C学习点滴

    char c 8 apple orange banana printf d sizeof c printf d strlen c 答案 24 5 printf d sizeof c 这个为什么是24 很好理解 sizeof是判断类型占用大小
  • App UI自动化元素定位工具之三__weditor

    App UI自动化元素定位工具之一 weditor 1 App UI自动化的核心逻辑 1 1 查看元素 根据元素特征定位元素 1 2 操作元素 点击 输入 获取元素信息等操作 1 3 根据返回做进一步处理 代码逻辑 2 用途 2 1 and
  • JS复习-21-sql语句使用

    查询的 sql 语句 1 查询所有 SELECT FROM 表 查询这个表里面的所有数据 每一个数据的每一个字段都要 sql SELECT FROM student 2 查询所有数据 但是只要几个字段 SELECT 字段1 字段2 FROM
  • nt服务器虚拟,NT 下虚拟域名的实现-ASP教程,系统相关

    虚拟域名实际上是虚拟主机的一种 虚拟主机的出现是为了节省硬件的投资 如果 isp 为每个申请了域名的用户都使用一台单独的机器 显然费用会很高 而且对于访问不是很频繁的站点来说也是一种浪费 所以就出现了大家公用一台机器 但每个用户之间相互独立
  • windows 平台下编译openssl 最新版本-3.0.5

    根据openssl 官方仓库的描述 他们不提供二进制版本的文件 需要我们自己针对不同的平台打包 环境配置 安装好以下软件 并配置好环境变量 Perl Nasm namke exe cl exe 最后两个可以通过安装好vs2022 自动可以使
  • 分号与逗号的区别及举例_如何掌握分号的用法 和顿号有什么区别

    如何掌握分号的用法 和顿号有什么区别2019 03 08 15 57 09文 李男 考试中作文成绩因为标点符号丢分的情况时有发生 看到这样丢分的情况 令人叹息 下面小编整理了一些关于分号的用法 供大家参考 分号的用法有哪些 下列几种情况使用
  • 关于捕食者方程在matlab中的应用

    由于是非专业人士 直接找到一个例子 copy如下 首先自定义一个函数 function z weifen bulie t y z 1 y 1 0 05 y 1 y 2 z 2 y 2 0 03 y 1 y 2 end 之后直接运行 捕食者与
  • 主流性能测试工具

    目前市场上的性能测试工具较多 主流的性能测试工具有 LoadRunner QALoad SilkPerformer 和 Rational Performance Tester 这类都为负载性能测试工具 其原理都相同 首先是录制脚本 通过录制
  • android下拉框

    下拉列表的方式 layout中的 xml文件
  • 【springboot test】springboot 单元测试配置文件加载顺序及覆盖关系

    springboot test 配置文件加载顺序及覆盖关系 参照目录结构 1 配置文件加载基础原则 2 application yml主配置文件加载原则 3 application yml中指定spring profiles active
  • 【部署】TensorRT(二)TensorRT的C++接口

    1 配置 qt的pro配置文件 TensorRT 头文件路径 INCLUDEPATH usr include x86 64 linux gnu 查找 sudo find name NvInfer h 链接TensorRT的库文件 LIBS
  • pgsql CURRENT_DATE 当前日期 加减日期 混合case when sum()

    pgsql CURRENT DATE 当前日期 加减日期 混合case when sum 写法如下 SUM CASE WHEN ai date due lt CURRENT DATE INTERVAL 90 day AND ai date
  • html中使用js实现福彩双色球随机选号

    福彩双色球随机选号 页面预览 代码实现
  • Neo4j Desktop 图数据库的导出方式

    先打开Neo4j Desktop 不要Start数据库 不然无法导出 选着想导出的数据库 1 点击Terminal之后 进入终端 本机的图数据目录如下 2 为了能够执行neo4j admin命令 需要进入bin目录 cd bin 3 数据库
  • g++ 编译pybind

    简单的 g O3 march native Wall shared std c 11 fPIC undefined python3 m pybind11 includes example cpp o example python3 conf
  • Docker如何安装RabbitMQ

    安装RabbitMQ有两以下两种常用方式 使用RabbitMQ安装包 使用Docker容器安装 推荐 由于Docker容器并不会影响我们之前安装在Linux系统上的其他服务 所以可以放心的使用Docker进行RabbitMQ的安装 并且采用
  • Java字节流与字符流的区别

    字节流与和字符流的使用非常相似 两者除了操作代码上的不同之外 是否还有其他的不同呢 实际上字节流在操作时本身不会用到缓冲区 内存 是文件本身直接操作的 而字符流在操作时使用了缓冲区 通过缓冲区再操作文件 如图12 6所示 下面以两个写文件的