永发信息网

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

答案:5  悬赏:20  手机版
解决时间 2021-03-14 09:13
1. Java I/O中字符流和字节流的区别?
最佳答案
字节流与和字符流的使用非常相似,但实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流。

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();                
// 此时没有关闭    
    }    
}
此时,文件中已经存在了内容,更进一步证明内容是保存在缓冲区的。这一点在读者日后的开发中要特别引起注意。

全部回答
简单点儿说如下:
字符流:
你给你婆娘发了条短信: I LOVE U。 这个时候就是字符流
字节流:
你给你婆娘发了张骚照片: {...xsdfe..sd.fd.ef..}。 这个时候照片是无法通过ABC来表示的,是一堆你看不出来的binary码,这个时候就是字节流。
骚年,了解了不?
字符流可以操作所有的文件,包括二进制
字节流只能操作文本文件。
字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件
可以使用两个例子来说明:
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!!!";
//其他的区别 楼上的已经说了..
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节, 操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是 音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点.
所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列.
字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
潮涮旋转自助火锅这个地址在什么地方,我要处
凌晨(一天的开始)是十二小时制的什么时间?
怎样在excel里连续输入有千卫分隔符的数字
剑网三男职业哪个强势
鲁迅的《风筝》第二段的表达方式是什么?这样
杖可以组什么词
中国移动站前路指定专营店地址有知道的么?有
l.m.hot中文是什么意思
双眼皮把眼贴坏了
笔记本维修主板多少钱 我这种情况能修理么
一年有几个月只有28日?
鸿腾旅馆怎么去啊,有知道地址的么
w今天中国和卡塔尔的足球比赛结果
金三角酒店怎么去啊,有知道地址的么
实心球扔的时候蹬地怎么蹬?我老是刻意去蹬,没
推荐资讯
之前公司帮我买了住房公积金,但现在辞职了,
捡了个苹果六,但是刷机了,成砖头了,有没有
就要你惜双双完结的小说谁有
天龙八部密保卡丢了怎么办??
总有不想活下去的想法,我应该怎么办
是宽于律己 严以待人还是严以待人宽以待己
雅芳格子屋地址在什么地方,想过去办事
竹青香菜馆怎么去啊,有知道地址的么
新粤陶瓷我想知道这个在什么地方
齐力堂大药房NO.8地址在哪,我要去那里办事
公园路/鲁大复线(路口)这个地址在什么地方,
圆直径公式。用汉字写,五年级能明白的
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?