java 字节流和字符流的区别详解

 更新时间:2019年09月04日 14:22:28   作者:zhangniuniu  
这篇文章主要介绍了java 字节流和字符流的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

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

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

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

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

程序运行结果:

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

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

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

程序运行结果:

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

提问:什么叫缓冲区?

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

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

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

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

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

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

范例:强制性清空缓冲区

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

程序运行结果:

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

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

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

回答:使用字节流更好。

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

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

流分类: 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等

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring纯注解开发模式让开发简化更简化

    Spring纯注解开发模式让开发简化更简化

    Spring3.0引入了纯注解开发的模式,框架的诞生是为了简化开发,那注解开发就是简化再简化。Spring的特性在整合MyBatis方面体现的淋漓尽致哦
    2022-08-08
  • springcloud引入spring-cloud-starter-openfeign失败的解决

    springcloud引入spring-cloud-starter-openfeign失败的解决

    这篇文章主要介绍了springcloud 引入spring-cloud-starter-openfeign失败的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 深入浅析Netty 在 Dubbo 中是如何应用的

    深入浅析Netty 在 Dubbo 中是如何应用的

    国内知名框架 Dubbo 底层使用的是 Netty 作为网络通信,那么内部到底是如何使用的呢?今天通过本文给大家详细讲解,对Netty 在 Dubbo中应用相关知识感兴趣的朋友跟随小编一起看看吧
    2020-05-05
  • elasticsearch集群cluster示例详解

    elasticsearch集群cluster示例详解

    这篇文章主要为大家介绍了elasticsearch集群cluster示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • Java的Cglib动态代理实现方式详解

    Java的Cglib动态代理实现方式详解

    这篇文章主要介绍了Java的Cglib动态代理实现方式详解,CGLIB是强大的、高性能的代码生成库,被广泛应用于AOP框架,它底层使用ASM来操作字节码生成新的类,为对象引入间接级别,以控制对象的访问,需要的朋友可以参考下
    2023-11-11
  • Java面试必备之JMM高并发编程详解

    Java面试必备之JMM高并发编程详解

    高并发(High Cuncurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并发处理很多请求
    2022-07-07
  • SpringBoot全局异常处理之解决404/500错误

    SpringBoot全局异常处理之解决404/500错误

    在搭建项目框架的时候用的是springboot,想统一处理异常,但是发现404的错误总是捕捉不到,总是返回的是springBoot自带的错误结果信息,这篇文章主要给大家介绍了关于SpringBoot全局异常处理之解决404/500错误的相关资料,需要的朋友可以参考下
    2023-11-11
  • spring boot使用properties定义短信模板的方法教程

    spring boot使用properties定义短信模板的方法教程

    这篇文章主要给大家介绍了关于spring boot使用properties定义短信模板的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • Springboot 如何指定获取出 yml文件里面的配置值

    Springboot 如何指定获取出 yml文件里面的配置值

    这篇文章主要介绍了Springboot 如何指定获取出 yml文件里面的配置值操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java中比较器Comparator和Comparable的区别

    Java中比较器Comparator和Comparable的区别

    这篇文章主要介绍了Java中比较器Comparator和Comparable的区别,我们在使用 Collections.sort()对链表进行排序时,常常需要根据不同情况自定义排序规则,今天我们来看看比较器之间的区别,需要的朋友可以参考下
    2023-08-08

最新评论