1. Java I/O中字符流和字节流的区别?

 我来答
samismiling
推荐于2016-04-10 · 知道合伙人软件行家
samismiling
知道合伙人软件行家
采纳数:1340 获赞数:5604

向TA提问 私信TA
展开全部

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

1、使用字节流不关闭执行


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();                  
// 此时没有关闭    
        }    
    }

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

2、使用字符流不关闭执行

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()方法完成。

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();                
// 此时没有关闭    
    }    
}


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

怒而哈斥
2012-11-21
知道答主
回答量:42
采纳率:0%
帮助的人:24.4万
展开全部
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节, 操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是 音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点.
所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列.
字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zuefir604
2012-11-21 · 超过10用户采纳过TA的回答
知道答主
回答量:25
采纳率:0%
帮助的人:20万
展开全部
字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件
可以使用两个例子来说明:
1:使用字节流不关闭执行

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(); // 没有关闭
} //结果你会看看生成的文件中有 "Hello World!!!"

2:使用字符流不关闭执行
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(); // 没有关闭
}
} //结果你会看看生成的文件中没有 "Hello World!!!";
//其他的区别 楼上的已经说了..
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gz_pratt
2012-11-21
知道答主
回答量:46
采纳率:0%
帮助的人:21.9万
展开全部
简单点儿说如下:
字符流:
你给你婆娘发了条短信: I LOVE U。 这个时候就是字符流

字节流:
你给你婆娘发了张骚照片: {...xsdfe..sd.fd.ef..}。 这个时候照片是无法通过ABC来表示的,是一堆你看不出来的binary码,这个时候就是字节流。

骚年,了解了不?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-11-21
展开全部
字符流可以操作所有的文件,包括二进制
字节流只能操作文本文件。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式