java 字节流与字符流的区别

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

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


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

程序运行结果:

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

package 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();                  
// 此时没有关闭    }    }   


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

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();                   
// 此时没有关闭    }    
}   

程序运行结果:


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

 


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

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


范例:强制性清空缓冲区

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();                
// 此时没有关闭    }    
}   

程序运行结果:

此时,文件中已经存在了内容,更进一步证明内容是保存在缓冲区的。这一点在读者日后的开发中要特别引起注意。
提问:使用字节流好还是字符流好?学习完字节流和字符流的基本操作后,已经大概地明白了操作流程的各个区别,那么在开发中是使用字节流好还是字符流好呢?
回答:使用字节流更好。

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

 

字节流与字符流主要的区别是他们的的处理方式
流分类:
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等

 

try{ }:最后结果是,文本里面也是照样保存了

File f1 = new File("F:/test/text.txt");// 创建基于文件的Writertry (FileWriter fr = new FileWriter(f1)) {// 以字符流的形式把数据写入到文件中String data="abcdefg1234567890";char[] cs = data.toCharArray();fr.write(cs);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

 这个try(){}catch{},try后面()会自动释放资源的,所以说表面是没有关闭,其实是关闭流了,这个jdk1,7的新特性,叫自动资源管理

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Java IO 字节流、字符流详解

1. 字节流与字符流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向…

【Java基础-3】吃透Java IO:字节流、字符流、缓冲流

Java IO流 前言1 初识Java IO1.1 IO流分类1.2 案例实操 2 IO流对象2.1 File类2.2 字节流2.3 字符流2.4 序列化 3 IO流方法3.1 字节流方法3.2 字符流方法 4 附加内容4.1 位、字节、字符4.2 IO流效率对比4.3 NIO 前言 有人曾问fastjson的作者(阿里技术专家高铁&#x…

字节流和字符流详解

1.流的概念 在编程中是一种抽象的概念,就好比“水流”,从一段流向另一端在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用…

Java IO流 - 字节流的使用详细介绍

文章目录 IO流的基本介绍字节流的使用文件字节输入流创建字节输入流每次读取一个字节每次读取一个数组一次读取全部字节 文件字节输出流创建字节输出流写入文件输出流 文件拷贝练习 IO流的基本介绍 IO流的概述: I 表示intput,是数据从硬盘文件读入到内存的过程&…

字节流(IO流)概述、字节流(写入/输出)数据(3种)和换行、追加写入、异常处理办法、字节缓冲流、字节流复制图片视频案例

目录 IO流概述和分类字节流写入数据(OutputStream)FileOutputStream字节流写数据的3种方式 字节流写入数据的两个小问题字节流写数据如何换行字节流如何实现追加写入 字节流写入数据加入异常处理字节流读取数据(InputStream)FileI…

字节流

字节流 根据数据的流向分为:输入流和输出流。 输入流 :把数据从其他设备上读取到内存中的流。输出流 :把数据从内存 中写出到其他设备上的流。 格局数据的类型分为:字节流和字符流。字节流 :以字节为单位&#xff0c…

1、字节流详解

文章目录 一、字节流1、字节输出流:OutputStream2、字节输入流:InputStream3、使用字节流复制数据4、字节缓冲流 一、字节流 文件字节流 字节流的两个抽象父类:字节输出流:OutputStream和字节输入流:InputStream 1、字…

PS美工教程:制作真实水面倒影效果详细步骤

倒影效果是电商海报和广告类海报常用的表现手法,倒影可以填充画面的空白区域和营造真实的视觉感受,给受众带来更好的视觉体验。 在海报合成中倒影效果可谓是必不可少的存在,那今天潇洒模具学院的老师就教大家通过PS自带的功能打造出真实的环…

CSS图片倒影效果

先看一下效果图 废话不多说直接上代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style lang"scss">img {-webkit-box-reflect: below 0px -webkit-linear-gradient(bottom, rgba(25…

3、水面倒影效果

水面倒影效果 概要 我们会使用 Matplotlib 的 pyplot 模块创建图并显示图像&#xff1a; 用以下魔术命令&#xff0c;以便将图像显示在笔记本中而不是在新的显示窗口中&#xff1a; 如果要显示彩色图像&#xff0c;可以使用以下命令将图像从 BGR 转换为 RGB。 最后使用 plt…

CSS3实现倒影效果

css的功能很强大&#xff0c;可以实现很多效果。比如图像的倒影和文字的倒影等&#xff0c;利用的是box-reflect&#xff0c;因为浏览器兼容问题&#xff0c;目前主要采用-webkit-box-reflect来实现&#xff08;谷歌浏览器&#xff09;。 倒影的属性&#xff1a; box-reflect&…

HTML里面设置文本倒影,文字倒影怎么做

现在的文字如果仅仅是在一个平面上,不加任何效果,那就真的是太死板、太单调了,尤其追求艺术的小伙伴们啊,细心的话你就会发现那些神马广告之类的文字都讲究有个性,让人过目不忘的效果,有木有!那么接下来就教大家制作文字效果,就是文字倒影效果制作。广告时间: 人物素描…

倒影(reflections)效果的实现

1、简介 当站在湖畔岸边或者镜子面前的时候&#xff0c;都可以看到倒着的自己&#xff0c;那种效果就叫倒影&#xff0c;或者叫镜面反射。在SPE中也支持这种效果&#xff0c;实现的基本思路是把物体根据反射平面镜像之后再绘制一遍&#xff0c;绘制镜像时有几个问题需要注意&a…

渐变加蒙版做倒影

平面设计是PHOTOSHOP应用最为广泛的领域&#xff0c;无论是我们正在阅读的图书封面&#xff0c;还是大街上看到的招帖、海报&#xff0c;这些具有丰富图像的平面印刷品&#xff0c;基本上都需要PHOTOSHOP软件对图像进行处理。用Photoshop 为图片添加倒影&#xff0c;这个效果不…

联想IBM ThinkPad X201i 笔记本显示屏上方中间的键盘灯不亮解决办法

这款小黑&#xff0c;不记得13年还是14年买的&#xff0c;当年就要7千大洋&#xff0c;那时候觉得很贵咬牙买了下来&#xff0c;今天回头看来贵有贵的道理。因为现在用起来还是很爽&#xff0c;去年安装Win10&#xff0c;然后在上面开发JavaEE项目&#xff0c;很快、畅顺。最近…

ibm 服务器 总显示f1,联想ThinkPad笔记本中F1/F4键盘指示灯一直常亮着如何解决

有不少使用联想ThinkPad笔记本的小伙伴们在使用电脑的时候&#xff0c;发现遇到这样一个情况&#xff0c;就是键盘上的F1/F4键盘状态指示灯常亮&#xff0c;按FNESC组合键也无法取消&#xff0c;按FN和对应的功能键也不行&#xff0c;这可该怎么解决呢&#xff0c;一般是由于热…

联想拯救者 Lenovo Legion 通电自启 插电自启 通电开机 插电开机 Wake on AC

联想拯救者 Lenovo Legion 通电自启 插电自启 通电开机 插电开机 Wake on AC 文章目录 联想拯救者 Lenovo Legion 通电自启 插电自启 通电开机 插电开机 Wake on AC说明一、我的电脑二、详细过程1.BIOS选项2.查阅改BIOS的资料3.修改BIOS失败4.换个思路&#xff1a;不修改BIOS?…

联想键盘sk8821的Fn功能键

1. 联想键盘sk8821的Fn功能键 1.1. 恢复 F1-F12实际功能 F1-F12系统下会默认为快捷键&#xff08;功能键&#xff09;&#xff0c;而非F1-F12实际功能。可能会导致您在使用习惯上的不适应。 键盘驱动安装目录&#xff1a;X:\LX_KEY\Yangtian\Low Profile Keyboard\setup.exe …

如何关闭联想台式机电脑USB键盘的FN功能

如何关闭联想台式机电脑USB键盘的FN功能 现在很多单位配备的联想台式机所配的USB键盘&#xff0c;F1-F12系统下会默认为快捷键&#xff08;功能键&#xff09;&#xff0c;而非F1-F12实际功能。可能会导致您在使用习惯上的不适应。 通过查询联想官网有如下解决方案&#xff0c;…

禁用联想笔记本电脑自带的键盘

最近电脑键盘出现故障&#xff0c;只要一开机&#xff0c;删除键就一直被按着&#xff0c;按其它键后&#xff0c;偶尔就恢复正常状态。被逼无奈&#xff0c;今天拿去电脑维修店&#xff0c;老板说是键盘的问题&#xff0c;需要换键盘。询问价格&#xff0c;说要&#xffe5;30…