Java字节流和字符流的区别

来源:互联网 发布:人工智能新闻 编辑:程序博客网 时间:2024/05/18 00:07

今天在学习中,突然感觉自己的Java输出输入流有些记忆模糊了。所以又重新温习下。从一些简单的知识点开始

吧。

在Java字节流与和字符流的使用非常相似,但是实际上字节流在操作时本身不会用到缓冲区(内存),是文件本

身直接操作的,而字符流在操作时需要使用缓冲区,通过缓冲区再操作文件。下面以两个写文件的操作为主进行比

较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流。

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

Java代码  收藏代码
  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.      File f = new File("d:" + File.separator + "test.txt"); // 声明File  对象    
  9. // 第2步:通过子类实例化父类对象    
  10.      OutputStream out = null;            
  11. // 准备好一个输出的对象    
  12.      out = new FileOutputStream(f);      
  13. // 通过对象多态性进行实例化    
  14. // 第3步:进行写操作    
  15.      String str = "Hello World!!!";      
  16. // 准备一个字符串    
  17.      byte b[] = str.getBytes();          
  18. // 字符串转byte数组    
  19.      out.write(b);                      
  20. // 将内容输出    
  21.  // 第4步:关闭输出流    
  22.     // out.close();                  
  23. // 此时没有关闭    
  24.         }    
  25.     }   

程序运行结果:Hello world!


此时没有关闭字节流操作,但是文件中也依然存在了输出的内容,证明字节流是直接操作文件本身的。而下面继

续使用字符流完成,再观察效果。

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

Java代码  收藏代码
  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.         File f = new File("d:" + File.separator + "test.txt");// 声明File 对象    
  9.         // 第2步:通过子类实例化父类对象    
  10.         Writer out = null;                 
  11. // 准备好一个输出的对象    
  12.         out = new FileWriter(f);            
  13. // 通过对象多态性进行实例化    
  14.         // 第3步:进行写操作    
  15.         String str = "Hello World!!!";      
  16. // 准备一个字符串    
  17.         out.write(str);                    
  18. // 将内容输出    
  19.         // 第4步:关闭输出流    
  20.         // out.close();                   
  21. // 此时没有关闭    
  22.     }    
  23. }   

程序运行结果:空


程序运行后会发现文件中没有任何内容,这是因为字符流操作时使用了缓冲区,而在关闭字符流时会强制性地将

缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区中的内容是无法输出的,所以得出结论:字符流使用了

缓冲区,而字节流没有使用缓冲区。

那么什么叫缓冲区呢?


其实缓冲区可以简单地理解为一段内存区域。也可以把缓冲区理解为一段特殊的内存。某些情况下,如果一个程

序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内

存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。

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

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

范例:强制性清空缓冲区


Java代码  收藏代码
  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.         File f = new File("d:" + File.separator + "test.txt");// 声明File    
  9. 对象    
  10.         // 第2步:通过子类实例化父类对象    
  11.         Writer out = null;                   
  12. // 准备好一个输出的对象    
  13.         out = new FileWriter(f);             
  14. // 通过对象多态性进行实例化    
  15.         // 第3步:进行写操作    
  16.         String str = "Hello World!!!";      
  17. // 准备一个字符串    
  18.         out.write(str);                    
  19. // 将内容输出    
  20.         out.flush();                       
  21. // 强制性清空缓冲区中的内容    
  22.         // 第4步:关闭输出流    
  23.         // out.close();                
  24. // 此时没有关闭    
  25.     }    
  26. }   


程序运行结果:Hello world!


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

字符流好呢?

个人感觉使用字节流更好。所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方

式存储的,而字符是只有在内存中才会形成,所以在开发中,个人感觉字节流稍微好一些,当然也要分情况。

但是要记住InputStream,OutputStream,Reader,writer都是抽象类。所以不可以直接new。

那什么时候使用字节流什么时候用字符流呢?

我把他们总结为以下分类:

是文本用BufferedReader /BufferedWriter

是对象用ObjectInputStream/ObjectOutputStream

是字节用BufferedInputStream/BufferedOutputStream 


一个小概念纠缠这么久,我看来真的是强迫症又犯了-。=...


0 0
原创粉丝点击