`

java 字节流与字符流的区别

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

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

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

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


分享到:
评论
2 楼 halu126 2014-01-18  
GeekDonie 写道
引用
所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。

这句话严格意义上是错误的
BufferedOutputStream也是字节流,它也使用了缓冲区

BufferedOutputStream的缓冲区是通过FilterOutputStream添加的!
1 楼 GeekDonie 2013-11-15  
引用
所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。

这句话严格意义上是错误的
BufferedOutputStream也是字节流,它也使用了缓冲区

相关推荐

    Java字符流与字节流区别

    Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。 Java 内用 Unicode 编码存储字符,字符流...

    JAVA 字符流与字节流

    在Java编程语言中,输入/输出(I/O)操作是处理数据流的关键部分,而字符流与字节流则是实现这些操作的两种基本方式。理解它们的区别和应用场景对于任何Java开发者来说都是至关重要的。 ### 字节流 字节流是最基本...

    Java字节流与字符流的介绍.pdf

    Java 字节流与字符流的介绍 Java 中的流操作可以分为两种:字节流和字符流。字节流是指以 byte 为单位进行读写操作的流,而字符流是指以 char 为单位进行读写操作的流。 字节流的介绍 字节流的所有读操作都继承自...

    java字节流和字符流

    Java中的字节流和字符流是IO操作中的两种基本类型,它们主要用于数据的输入和输出。字节流处理的数据单位是字节,而字符流处理的是Unicode字符。 字节流: 字节流主要由两个核心类构成:`InputStream`和`...

    java字节流和字符流[整理].pdf

    转换流:在字节流和字符流之间,Java提供了解决两者不兼容问题的转换流,即InputStreamReader和OutputStreamWriter。InputStreamReader是字节输入流到字符输入流的桥梁,而OutputStreamWriter则是字节输出流到字符...

    Java字符流和字节流

    ### Java字符流和字节流详解 #### 一、引言 在Java中,I/O流主要用于处理输入输出操作,包括文件读写等。根据处理数据类型的不同,Java I/O流主要分为字节流和字符流两大类。字节流处理的是8位的字节数据,而字符流...

    Java IO 字节流 字符流

    Java IO系统分为两大类:字节流和字符流。字节流主要用于处理任何类型的原始数据,如图片、音频文件或者二进制文件,而字符流则专注于处理基于文本的数据。本文将深入探讨这两类流的原理、用途以及它们之间的关联。 ...

    Java 字节流、字符流题目.docx

    Java的输入和输出主要涉及到流的...总的来说,这个实验旨在帮助学习者理解Java中字节流和字符流的基本概念和用法,包括文件的读写、字符与字节的转换以及流的层次结构。通过实践这些练习,可以深入掌握Java的I/O操作。

    Java 字节流、字符流题目.pdf

    在Java中,流分为字节流和字符流两大类,它们都是抽象的概念,用于表示数据流动的方向。字节流处理的数据单位是字节,而字符流处理的是Unicode编码的字符。 一、字节流 字节流分为输入流和输出流,Java中最基础的...

    Java IO字符流和字节流

    ### Java IO字符流和字节流详解 #### 一、引言 在Java编程中,输入输出(简称IO)操作是十分重要的一个方面。通过IO操作,我们可以读取文件、网络数据、用户输入等,也可以将数据写入到文件、网络、控制台等。Java...

    java 字节与字符流,字符流转换

    java 字节与字符流,字符流转换

    Java字节流 .pdf

    Java字节流是一种用于处理字节数据的流处理机制,在Java中,字节流不包含边界数据的连续流,字节流是由字节组成的,Java里字符由两个字节组成。字节流是最基本的,它是按字节来处理二进制数据。 字节流基类有:字节...

    JAVA_字节流和字符流

    在Java编程语言中,字节流(Byte Stream)和字符流(Character Stream)是处理输入输出数据的两种基本方式。字节流主要用于处理任何类型的二进制数据,如图片、音频、视频等,而字符流则专为处理基于Unicode编码的...

    Java基础11-(字节流、字符流)

    Java的IO流是按照数据的流向分为输入流和输出流,按照数据类型分为字节流和字符流。字节流处理的是二进制数据,适用于任何类型的文件,包括文本文件和非文本文件(如图片、音频、视频等)。字符流则用于处理字符数据...

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

    Java 字节流和字符流的区别详解 Java 中的字节流和字符流是两种不同的输入 / 输出流,它们之间的区别是非常重要的。在本文中,我们将详细介绍 Java 中的字节流和字符流的区别,并通过示例代码来演示它们的使用。 ...

    JAVA IO流缓冲字节流缓冲字符流等流经典代码示例加注释总结.rar

    2、常用21个IO流:FileWriter、FileReader、CharArrayReader、CharArrayWriter、...代码功能涉及字节、字符、字符串、文本文件、图片、音频、视频。演示错误用法和经典用法。 4、代码的结构可查看README文件。

    Java实现字节流与图片的转化

    在Java编程中,字节流(Byte Stream)是处理数据的基本方式,特别是在处理二进制数据,如图片、音频或视频文件时。本教程将详细讲解如何使用Java实现字节流来转换和处理图片。 首先,我们需要理解字节流的概念。在...

    Java字节流数据逐行读取(readLine)

    然而,`readLine()`方法通常与字符流Reader类关联,而不是字节流InputStream类。因此,要使用字节流实现数据逐行读取,我们需要结合`BufferedReader`和`InputStreamReader`。 首先,理解`readLine()`方法。它是`...

    字节流字符流

    字节流和字符流的区别在于处理数据的基本单位不同,字节流以8位的字节为单位,而字符流则以16位的Unicode字符为单位。 字节流分为输入流(InputStream)和输出流(OutputStream),主要用来处理二进制数据,如图像...

Global site tag (gtag.js) - Google Analytics