java字符流实际上也是字节,[Java教程]Java字节流与字符流的区别

[Java教程]Java字节流与字符流的区别

0 2017-05-22 12:00:42

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

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

bc91bb04e6e9c61e24c974e4440db8f2.gif

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

范例:使用字节流不关闭执行Java代码

bc91bb04e6e9c61e24c974e4440db8f2.gifpackage org.lxh.demo12.byteiodemo;

import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStream;

public class OutputStreamDemo05 {

public static void main(String[] args) throws Exception {   // 异常抛出,  不处理

// 第1步:使用File类找到一个文件

File f = new File("d:" + File.separator + "test.txt"); // 声明File  对象

// 第2步:通过子类实例化父类对象

OutputStream out = null;

// 准备好一个输出的对象

out = new FileOutputStream(f);

// 通过对象多态性进行实例化

// 第3步:进行写操作

String str = "Hello World!!!";

// 准备一个字符串

byte b[] = str.getBytes();

// 字符串转byte数组

out.write(b);

// 将内容输出

// 第4步:关闭输出流

// out.close();

// 此时没有关闭

}

}

程序运行结果:

bc91bb04e6e9c61e24c974e4440db8f2.gif

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

范例:使用字符流不关闭执行Java代码

bc91bb04e6e9c61e24c974e4440db8f2.gifpackage org.lxh.demo12.chariodemo;

import java.io.File;

import java.io.FileWriter;

import java.io.Writer;

public class WriterDemo03 {

public static void main(String[] args) throws Exception { // 异常抛出,  不处理

// 第1步:使用File类找到一个文件

File f = new File("d:" + File.separator + "test.txt");// 声明File 对象

// 第2步:通过子类实例化父类对象

Writer out = null;

// 准备好一个输出的对象

out = new FileWriter(f);

// 通过对象多态性进行实例化

// 第3步:进行写操作

String str = "Hello World!!!";

// 准备一个字符串

out.write(str);

// 将内容输出

// 第4步:关闭输出流

// out.close();

// 此时没有关闭

}

}

程序运行结果:

bc91bb04e6e9c61e24c974e4440db8f2.gif

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

提问:什么叫缓冲区?

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

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

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

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

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

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

范例:强制性清空缓冲区Java代码

bc91bb04e6e9c61e24c974e4440db8f2.gifpackage org.lxh.demo12.chariodemo;

import java.io.File;

import java.io.FileWriter;

import java.io.Writer;

public class WriterDemo04 {

public static void main(String[] args) throws Exception { // 异常抛出不处理

// 第1步:使用File类找到一个文件

File f = new File("d:" + File.separator + "test.txt");// 声明File

对象

// 第2步:通过子类实例化父类对象

Writer out = null;

// 准备好一个输出的对象

out = new FileWriter(f);

// 通过对象多态性进行实例化

// 第3步:进行写操作

String str = "Hello World!!!";

// 准备一个字符串

out.write(str);

// 将内容输出

out.flush();

// 强制性清空缓冲区中的内容

// 第4步:关闭输出流

// out.close();

// 此时没有关闭

}

}

程序运行结果:

bc91bb04e6e9c61e24c974e4440db8f2.gif

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

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

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

回答:使用字节流更好。

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

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

流分类:

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等。学习Java的同学注意了!!!

学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:618528494我们一起学Java!

本文网址:http://www.shaoqun.com/a/309046.html

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

JAVA

0

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

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

相关文章

redis主从集群搭建eclipse_【Redis】Redis 主从模式搭建

主从模式介绍Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。下图…

unicode编码 php,PHP 的 UNICODE 编码和解码

方法一:function unicode_encode($name){$name iconv(UTF-8, UCS-2, $name);$len strlen($name);$str ;for ($i 0; $i < $len - 1; $i $i 2){$c $name[$i];$c2 $name[$i 1];if (ord($c) > 0){ //两个字节的文字$str . \u.base_convert(ord($c), 10, 16).str_pad…

django models索引_sql – 为什么Django显式地在唯一字段上创建索引

更新&#xff1a;进一步简化实验psql的Q&#xff1a;对于以下Django模型&#xff1a;class Book(models.Model):name models.TextField(uniqueTrue)pg_dump(PostgreSQL 9.3)显示下表&限制&#xff1a;CREATE TABLE book (id integer NOT NULL,name text NOT NULL,);ALTER …

php获取指定日期的万年历,分享3个php获取日历的函数

提供一个日期,获取这个日期的星期对应日历列表,键为星期标示$month_date 2015-09-25;$start_time strtotime($month_date);$start_week date(w, $start_time);$total_month_day date(t, $start_time);$weeks_in_month ceil(($start_week$total_month_day)/7);$month_day_a…

php获取html中文本框内容_小猿圈Python入门之批量获取html内body内容的方法

对于人工智能你了解有多少&#xff1f;你知道Python的使用吗&#xff1f;这个对于大部分初学者来说都是很难的&#xff0c;小猿圈Python讲师会每天为大家选择分享一个知识点&#xff0c;希望对你学习Python有所帮助&#xff0c;今天分享的就是批量获取html内body内容的方法。现…

php改名下载,PHP如何给上传的文件改名

PHP如何给上传的文件改名发布时间&#xff1a;2020-08-03 16:07:39来源&#xff1a;亿速云阅读&#xff1a;72作者&#xff1a;LeahPHP如何给上传的文件改名&#xff1f;相信很多没有经验的人对此束手无策&#xff0c;为此本文总结了问题出现的原因和解决方法&#xff0c;通过这…

python 循环 覆盖之前print内容_Python爬虫第二战---爬取500px图片

前言&#xff1a;如今的高速网络极大促进了信息的展示方式&#xff0c;高清图片&#xff0c;视频等成就了我们的视听盛宴。但是&#xff0c;我们获取到的图片或者视频可能是被压缩过的&#xff0c;所以总体上还是有点小瑕疵&#xff0c;今天呢&#xff0c;我给大家带来一篇使用…

php字符串分割tp模板,ThinkPHP 模板substr的截取字符串函数详解

ThinkPHP 模板substr的截取字符串函数在Common/function.php加上以下代码/**** 截取中文字符串**/function msubstr($str, $start0, $length, $charset"utf-8", $suffixtrue){if(function_exists("mb_substr")){$slice mb_substr($str, $start, $length, $…

macyy_macyy进频道失败怎么办

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。macyy进频道失败的解决方法&#xff1a;1、进入不了频道请先留意自己当地的网络状况是否良好&#xff0c;电脑上尽量不要开启占用网络资源的软件&#xff0c;如&#xff1a;下载工具…

tomcat.exe java home,tomcat.exe启动和startup.bat启动的不同

一、tomcat7.exe与startup.bat的区别&#xff1a;1、这两个都可以启动tomcat&#xff0c;但tomcat7.exe必须安装了服务才能启动&#xff0c;而startup.bat不需要2、另外一个区别是它们启动所使用的JAVA环境配置是分开的tomcat7.exe启动所使用JAVA配置与服务启动所使用的JAVA配置…

acc定义代码 神经网络_神经网络的这几个坑,你都躲过了吗

因为AI这两年的火爆&#xff0c;大家拿着锤子到处找钉子&#xff0c;锤子当然也砸到了我头上&#xff0c;有很多做业务的同事尝试通过AI的方法解决需要一些很复杂的业务逻辑算法&#xff0c;同时需要很多参数组合才能搞定的问题。但因为都是非科班出身也没有系统学习&#xff0…

java事件绑定,Java编程GUI中的事件绑定代码示例

程序绑定的概念&#xff1a;绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说&#xff0c;绑定分为静态绑定和动态绑定&#xff1b;或者叫做前期绑定和后期绑定静态绑定&#xff1a;在程序执行前方法已经被绑定&#xff0c;此时由编译器或其它连接程序实…

python抽荣耀水晶_教你2种免费拿荣耀水晶的方法,获奖概率让人惊喜,一般人我不告诉他...

在王者荣耀中荣耀水晶一直是许多玩家想要得到的&#xff0c;那一般来说想要获取一个荣耀水晶需要花费大约2000RMB的样子&#xff0c;但是可喜的是王者荣耀这个游戏就是这么的亲民&#xff0c;会时不时的上线一些免费赠送的活动&#xff0c;那今天就告诉大家最近2种获取荣耀水晶…

matlab中右三角形方向,《有限元基础教程》_【MATLAB算例】4.7.1(2) 基于3节点三角形单元的矩形薄板分析(Triangle2D3Node)...

【MATLAB 算例】4.7.1(2) 基于3节点三角形单元的矩形薄板分析(T riangle2D3Node)如图4-20所示为一矩形薄平板&#xff0c;在右端部受集中力100 000F N 作用&#xff0c;材料常数为&#xff1a;弹性模量7110E Pa ?&#xff0c;泊松比13μ&#xff0c;板的厚度0.1t m 。基于MA T…

uv转化率多少正常_浏览量(PV)和访客数(UV)和跳出率是什么意思?

1.什么是访客数(UV访客数就是指一天之内到底有多少不同的用户访问了网站。访客数要比IP数更能真实准确地反映用户数量。百度统计完全抛弃了IP这个指标&#xff0c;而启用了访客数这一指标&#xff0c;因为IP往往不能反映真实的用户数量。尤其对于一些流量较少的企业站来说&…

vscode中如何创新建php文件,vscode如何创建代码模板

选择菜单里的 文件 > 首选项 > 用户代码片段选择你需要自定义模板的文件&#xff0c;以vue为例配置对应文件json把代码片段写在json里。每个代码段都是在一个代码片段名称下定义的&#xff0c;并且有prefix、body和description。prefix是用来触发代码片段的。使用 $1&…

linux nginx postgresql php,常用Web环境架设手册PNP:Postgresql+Nginx+PHP

一 Postgresql1.1 installready:sudo apt-get updatesudo apt-get install libreadline6-devsudo apt-get install zlib1g zlib1g.devcd source./configuresudo make installsudo adduser postgressudo mkdir /usr/local/pgsql/datasudo chown postgres /usr/local/pgsql/data…

php 利用个人邮箱,利用 Composer 完善自己的 PHP 框架(二)——发送邮件

利用 Composer 完善自己的 PHP 框架(二)——发送邮件2014-10-18 / 阅读数&#xff1a;23506 / 分类&#xff1a; PHP回顾上一篇文章中&#xff0c;我们手工建造了一个简易的视图加载器&#xff0c;顺便引入了错误处理包&#xff0c;让我们的 MFFC 框架在 M、V、C 三个方面都达到…

mysql安装被打断_MySQL安装未响应解决方法

安装MySQL出示未响应&#xff0c;一般显示在安装MySQL程序最后一步的2&#xff0c;3项就不动了。这种情况一般是你以前安装过MySQL数据库服务项被占用了。解决方法&#xff1a;一种方法&#xff1a;你可以安装MySQL的时候在这一步时它默认的服务名是“MySQL” 只需要把这个名字…

启动马达接线实物图_东元伺服驱动马达

东元伺服驱动马达&#xff0c;我公司主营德国SEW&#xff0c;德国法勒VAHLE, 德国UNING&#xff0c;德国同驰Tschan&#xff0c;意大利威卡WESTCAR&#xff0c;德国久茂JUMO&#xff0c;瑞士ABB等几大世界品牌产品。东元伺服驱动马达&#xff0c; 工业机器人电动伺服系统的一般…