java 字节流与字符流的区别

转载 2015年07月08日 17:00:28
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 

实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如图12-6所示。 
 
下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流。 

范例:使用字节流不关闭执行 
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. }   

程序运行结果: 
 



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

提问:什么叫缓冲区? 

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

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

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

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

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

如果想在不关闭时也可以将字符流的内容全部输出,则可以使用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. }   


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

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

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

回答:使用字节流更好。 

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


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

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

字节流和字符流的区别,以及对象的使用。

1.首先先区分一下字符和字节 a.字节就是计算机存储信息的基本单位,01010101011101 b.字符是指一个符号占多少个字节,比如一个汉字占两个字节,一个英文标点占一个字节............
  • kunfd
  • kunfd
  • 2016年09月07日 21:48
  • 1154

Java中字符流和字节流到底有什么区别!!!

stream结尾都是字节流,reader和writer结尾都是字符流 两者的区别就是读写的时候一个是按字节读写,一个是按字符。 实际使用通常差不多。 在读写文件需要对内容按行处理,比如比较特定字...
  • a360303383
  • a360303383
  • 2017年05月24日 08:41
  • 146

Java 字节流与字符流的总结和理解

常用流的介绍Java 输入输出流中主要有几个重要的类,掌握了这几种,其他的流可以类比学习。 下面就着重学习以下的类: ***Inputstream Outputstream FileInp...
  • u014150951
  • u014150951
  • 2016年07月06日 14:42
  • 1377

字节流、字符流和缓冲流

字节流和字符流,且他们都有输入流(从屏幕、硬盘或是其他数据源读取数据放入内存中)和输出流(用来向屏幕、硬盘等目的地输出内容),字节流就是一个字节一个字节的读取或是输出(字节都是8位,0到255之间的整...
  • muyisengren
  • muyisengren
  • 2014年10月15日 15:44
  • 2195

菜鸟举例理解字节流和字符流区别

菜鸟举例理解字节流和字符流区别 按照uft8编码方式存储文档 文档存储路径在D盘下 /** * 按照utf8格式存储文档 */ public static void storeDataB...
  • wu_cai_
  • wu_cai_
  • 2016年10月14日 21:01
  • 673

字符流和字节流的区别,使用场景,相关类

Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。 Java 内...
  • zj8692286
  • zj8692286
  • 2013年10月12日 13:48
  • 15049

字节流与字符流的详解,文件流,数据流

首先看一下File类的常用方法 •File类的对象不但可以表示文件,还可以表示目录,在程序中一个File类对象可以代表一个文件或目录; •当创建一个文件对象后,就可以利用它来对文件或目...
  • qq_34681261
  • qq_34681261
  • 2017年04月29日 19:54
  • 489

Java基础:IO流之字节流和字符流

一、流的概念流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。一个流,必有源端和目的端,它们...
  • axi295309066
  • axi295309066
  • 2016年10月15日 00:23
  • 1513

IO流之字节流和字符流的区别

java.io包中的stream类根据它们操作对象的类型是字符还是字节可分为两大类: 字符流和字节流。 它们之间的区别在于以下几点: 1、 stream结尾都是字节流,如:FileInputStrea...
  • I_Am_Zou
  • I_Am_Zou
  • 2016年07月29日 17:00
  • 831

java.io 字节流与字符流及简单实例

java io是java中非常基础的知识点,对于通信和不涉及到数据库的项目java io应该是要经常使用。java io分为字节流和字符流,分清字节流和字符流的异同是掌握java io的起点。...
  • renxyz
  • renxyz
  • 2014年10月28日 13:45
  • 895
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 字节流与字符流的区别
举报原因:
原因补充:

(最多只允许输入30个字)