首页 > 编程语言 >java 字节流和字符流的区别

java 字节流和字符流的区别

时间:2022-12-19 22:31:21浏览次数:48  
标签:字符 java 字节 File 缓冲区 String


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

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


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

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


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


程序运行结果: <iframe id="iframe_0.47477991224121197" style="margin: 0px; padding: 0px; border-width: initial; border-style: none; width: 1022px;" srcx?url=http%3A%2F%2Fimages.51cto.com%2Ffiles%2Fuploadimg%2F20090731%2F162913379.jpg&amp;maxWidth=1022&amp;origin=21197" frameborder="0" scrolling="no" height="75"></iframe>


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

提问:什么叫缓冲区?

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

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

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

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

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

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

范例:强制性清空缓冲区



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



程序运行结果: <iframe id="iframe_0.44044282764198384" style="margin: 0px; padding: 0px; border-width: initial; border-style: none; width: 1022px;" src="htt.aspx?url=http%3A%2F%2Fimages.51cto.com%2Ffiles%2Fuploadimg%2F20090731%2F163055734.jpg&amp;maxWidth=1022&amp;origin=http:0.44044282764198384" frameborder="0" scrolling="no" height="72"></iframe>此时,文件中已经存在了内容,更进一步证明内容是保存在缓冲区的。这一点在读者日后的开发中要特别引起注意。

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

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

回答:使用字节流更好。

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

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

流分类: 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,字节,File,缓冲区,String
From: https://blog.51cto.com/toutiao/5953954

相关文章

  • 字符和文档识别的四十年研究
    Received15February2008Receivedinrevisedform10March2008Accepted11March2008摘要:本文简要介绍在过去的40年中字符和文档识别领域的技术进步,对于每十年中的代表进......
  • c中字符串常见操作函数
    字符串处理函数:  #include<string.h>   字符串拷贝:      strcpy:         将src的内容,拷贝给dest。返回dest。保证dest空间足够大。......
  • [LeetCode]008-字符串转换整数(atoi)
    >>>传送门题目请你来实现一个 myAtoi(strings) 函数,使其能将字符串转换成一个32位有符号整数(类似C/C++中的atoi函数)。函数 myAtoi(strings)的算法如下:读......
  • Java执行操作系统命令-Process抽象类(1)
    Java8Windows10EclipseVersion:2022-09(4.25.0)-- 序章测试使用Java程序执行操作系统命令。ben发布于博客园需要用到抽象类Process://@sinceJDK1.0publ......
  • Java关键词final解读
    目录1final基本用法1.1final修饰变量1.2final修饰方法参数1.3final修饰方法1.4final修饰类1.5空白final1.6staticfinal2jvm角度理解final不可变性3final多线程下......
  • 剑指offer 字符串的排列(C++)
    题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:......
  • Java笔记(7)——equals和toString方法的重写和一个例子
    1.Object类​​Object​​​类是所有类的根父类,如果在类中没有​​extends​​关键字指明其父类,默认其父类为Object类。2.==与equals方法的区别​​==​​​:是否指向了同......
  • Java笔记(8)——重载(Overload)与重写(Override)的区别
    1、重写(Override)  重写是子类对允许访问的父类的方法进行重新编写的过程,方法名、返回值和参数列表不能变,方法中的内容可以变化。特点就是:子类可以根据自己的需要对父类的......
  • Java笔记(10)——异常处理
    1、Java异常  Java运行时发生异常可以分为两类:​​Error​​​:​​JVM​​系统内部错误、资源耗尽等问题产生的异常。​​Exception​​:编程错误或偶然的外在因素导致的......
  • Java笔记(5)——类的继承、访问控制、super关键字
      在类中,不写构造方法,相当于执行了默认的无参构造方法;写了有参构造方法,则只执行有参构造方法,默认的无参构造方法则会被屏蔽掉;若想拥有有参和无参构造方法,则同时显示地写出......