A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

什么时候用字符流,什么时候用字节流呢

11 个回复

倒序浏览
如果你操作的是文本,那么用字符流比较好
如果你操作的是文本以外的其他类型,如;mp3 图片,视频等媒体文件,那么就要用字节流了

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
//第十八天07
//字符流和字节流
//字节流两个基类:InputStream  OutputStream
//
//字符流的两个基类:Reader Writer
//
//先学习一下字符流的特点。
//
//既然就IO流是用于操作数据的,
//那么数据的最常见体现形式是:文件
//
//那么先以操作文件为主来演示。
//
//需求:在硬盘上,创建一个文件并写入一些文字数据。
//
//找到一个专门用于操作文件的Writer子类对象。FileWriter。
//后缀名是父类名,前缀名是该流对象的功能。

package com.eighteen;

import java.io.FileWriter;
import java.io.IOException;

public class FileWriterDemo {
        public static void main(String[] args) {
//                创建一个FileWriter对象。该对象一被初始化就必须
//                要明确被操作的文件。
//                而且该文件会被创建发到指定目录下。如果该目录下已有同名文件,则将其覆盖。
//                其实该步骤就是在明确数据要存放的目的地。
                try {
                        FileWriter fw = new FileWriter("fw.txt");
                        //调用write方法,将字符串写到流中。
                        fw.write("abcde\t");
                        fw.write("zhu");
                        //刷新流对象中的缓冲中的数据。
                        //将数据刷到目的地去。
                       
//                        fw.flush();
                        //关闭流资源,但是关闭前会刷新一次内部的缓冲中的数据。
                        //将数据刷到目的地中。
                        //和flush的区别:flush刷新后,流可以继续使用,close刷新后则将流关闭。
                        fw.close();
//                        fw.write("aaa");
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
               
        }
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;

如果是文本文件建议用字符流,用字节流也行,只是要加包装,比字符流复杂些.
回复 使用道具 举报
Java IO 的一般使用原则 :
一、按数据来源(去向)分类:
1 、是文件: FileInputStream, FileOutputStream, ( 字节流 )FileReader, FileWriter( 字符 )
2 、是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字节流 )
3 、是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )
4 、是 String: StringBufferInputStream, StringBufferOuputStream ( 字节流 )StringReader, StringWriter( 字符流 )
5 、网络数据流: InputStream, OutputStream,( 字节流 ) Reader, Writer( 字符流 )
二、按是否格式化输出分:
1 、要格式化输出: PrintStream, PrintWriter
三、按是否要缓冲分:
1 、要缓冲: BufferedInputStream, BufferedOutputStream,( 字节流 ) BufferedReader, BufferedWriter( 字符流 )
四、按数据格式分:
1 、二进制格式(只要不能确定是纯文本的) : InputStream, OutputStream 及其所有带 Stream 结束的子类
2 、纯文本格式(含纯英文与汉字或其他编码方式); Reader, Writer 及其所有带 Reader, Writer 的子类
五、按输入输出分:
1 、输入: Reader, InputStream 类型的子类
2 、输出: Writer, OutputStream 类型的子类
六、特殊需要:
1 、从 Stream 到 Reader,Writer 的转换类: InputStreamReader, OutputStreamWriter
2 、对象输入输出: ObjectInputStream, ObjectOutputStream
3 、进程间通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
4 、合并输入: SequenceInputStream
5 、更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader
决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):
首先,考虑最原始的数据格式是什么: 原则四
第二,是输入还是输出:原则五
第三,是否需要转换流:原则六第 1 点
第四,数据来源(去向)是什么:原则一
第五,是否要缓冲:原则三 (特别注明:一定要注意的是 readLine() 是否有定义,有什么比 read, write 更特殊的输入或输出方法)
第六,是否要格式化输出:原则二

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
字符流 (reader),主要用来读取文本文件数据,例如:xxx.txt, xxx.java等
字节流(inputstream),这个更通用,可以读取除文本数据之外的文件,例如,视频呀,图片呀
如果读取和传输的数据类型不统一, 如要读取的是字节, 而想传输成字符, 可以用转换流,
InputStreamReader'是用在读取数据的时候, 它能将字节流转换成字符流
OutputStreamWriter是用在写出数据的时候, 它能将字符流转换成字节流
回复 使用道具 举报
计算机是以二进制编码存放数据的,字节流可以读取任何数据,字符流则只能读取字符类数据如文本文档,像图像,MP3等一字节存储的数据只能用字节流读。
回复 使用道具 举报
张超超 黑马帝 2012-4-19 09:28:53
8#
现总结一下关于字节流和字符流:
一:字符流
Reader和Writer(基类)
FileReader和FileWriter(定义字符输入、输出流)
BufferedReader和BufferedWriter(字符带缓冲输入、输出流)
LineNumberReader

二:字符流拷贝文件,4中方式
1.FileReader和FileWriter逐个字符拷贝
2.FileReader和FileWriter自定义数组拷贝
3.BufferedReader和BufferedWriter内置缓冲区逐个字符拷贝
4.BufferedReader和BufferedWriter逐行拷贝

  三:字节流
    OutputStream和InputStream(基类)
    FileOutputStream和FileInputStream(字节带缓冲输入、输出流)
    BufferedInputStream和BufferedOutputStream(字节缓冲输入、输出流)
   
  四:字符流拷贝文件,3种方式
1.FileInputStream和FileOutputStream, 逐个字节拷贝
2.FileInputStream和FileOutputStream, 自定义数组拷贝  
3.BufferedInputStream和BufferedOutputStream, 内置缓冲区拷贝

  五:什么时候使用字符流,字节流
当读取和写出一个字符串,使用字符流
当拷贝一个字符串,使用字节流
在我们读写任何数据的时候, 都能用字节流来做. 但是如果需要读写字符的时候, 使用字节流的话, 需要人工解码编码.
当我们读写字符的时候, 使用字符流更为方便, 它可以替我们自动解码编码.
当我们得到一个字节流, 需要向这个字节流中读写字符数据, 可以使用转换流将字节流转为字符流.

  六:转换流
  1.InputStreamReader, OutputStreamWriter
  2.字节流和字符流之间的桥梁, 可以从字节流中读取字符, 可以向字节流中写出字符
  
  七:什么时候用转换流和编码
  1.当我们得到一个字节输入流, 想从中读取字符的时候, 就可以使用InputStreamReader.
  2.当我们得到一个字节输出流, 想向其写出字符的时候, 就可以使用OutputStreamWriter.
  3.当我们读取非平台默认编码的字符数据时, 需要使用InputStreamReader.
  4.当我们写出非平台默认编码的字符数据时, 需要使用OutputStreamWriter.
  
  八.标准输入、输出流
1.标准输入流
  System.in是标准输入流, 默认可以从键盘输入读取字节数据.
  可以使用System.setIn(InputStream)修改数据源.
2.标准输出流
  System.out是标准输出流, 默认可以向屏幕输出数据
  可以使用System.setOut(PrintStream)修改数据目的地.
3.可以使用标准输入输出流拷贝文件

点评

回答别人的问题时,要先明白问的问题是什么,比如这题,你只需要把你学习日记中的“五”的内容作为回复内容即可。  发表于 2012-4-20 22:13
回复 使用道具 举报
字符流处理的单元为2个字节的Unicode字符,用于操作字符、字符数组或字符串,字节流处理单元为1个字节, 操作的是字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,因此它对多国语言支持性较完善!如果操作的是 音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点.
     所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件时,也是一个字节一个字节地读取以形成字节序列.
      字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。
回复 使用道具 举报
InputStream 和OutputStream,两个是字节流
Reader和 Writer两个是为字符流
字符流对多国语言支持性比较好,如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文文本的,用字符流好点
字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串,能直接处理Unicode字符
两者间通过 InputStreamReader,OutputStreamWriter来进行关联
回复 使用道具 举报
如果你操作的是文本,那么用字符流比较好,字符流涉及到各种编码,汉字编码为GBK,GB2312
如果你操作的是文本以外的其他类型,如;mp3 图片,视频等媒体文件,那么就要用字节流了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马