java 字节流与字符流的区别

java 字节流与字符流的区别

转载地址:点击打开连接html

字节流与和字符流的使用很是类似,二者除了操做代码上的不一样以外,是否还有其余的不一样呢?
实际上字节流在操做时自己不会用到缓冲区(内存),是文件自己直接操做的,而字符流在操做时使用了缓冲区,经过缓冲区再操做文件,如图12-6所示。

下面以两个写文件的操做为主进行比较,可是在操做时字节流和字符流的操做完成以后都不关闭输出流。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.     }   
程序运行结果:

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

 


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

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. }   
程序运行结果:


程序运行后会发现文件中没有任何内容,这是由于字符流操做时使用了缓冲区,而在关闭字符流时会强制性地将缓冲区中的内容进行输出,可是若是程序没有关闭,则缓冲区中的内容是没法输出的,因此得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。

 


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

回答:缓冲区能够简单地理解为一段内存区域。能够简单地把缓冲区理解为一段特殊的内存。某些状况下,若是一个程序频繁地操做一个资源(如文件或数据库),则性能会很低,此时为了提高性能,就能够将一部分数据暂时读入到内存的一块区域之中,之后直接今后区域中读取数据便可,由于读取内存速度会比较快,这样能够提高程序的性能。在字符流的操做中,全部的字符都是在内存中造成的,在输出前会将全部的内容暂时保存在内存之中,因此使用了缓冲区暂存数据。若是想在不关闭时也能够将字符流的内容所有输出,则可使用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. }   
程序运行结果:

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

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

 

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

有一个关键的参数字符集编码,一般咱们都省略了,那系统就用操做系统的lang 而在字符流转化为字节流时,其实是String转化为byte[]时, byte[]    String.getBytes(String charsetName) 也是同样的道理 至于java.io中还出现了许多其余的流,按主要是为了提升性能和使用方便, 如BufferedInputStream,PipedInputStream等
相关文章
相关标签/搜索