黑马程序员技术交流社区

标题: 操作文件什么时候用字符流或者字节流? [打印本页]

作者: 黑马张丽    时间: 2013-12-27 13:57
标题: 操作文件什么时候用字符流或者字节流?
1.在学习中,老师说关系到文本的话用字符流,请问他指的文本文件是后缀名为.txt的么?
2.如果是的话,为什么如下这里用的是字节流?到底什么时候用字节流什么时候用字符流?最好是自己理解的说,有些混淆了我。
   public static void main(String[] args) throws IOException {
8         File f = new File("d:" + File.separator+"test.txt");
              //用的字节输出流
9         OutputStream out=new FileOutputStream(f);
10         String str="Hello World";
11         byte[] b=str.getBytes();
12         for(int i=0;i<b.length;i++){
13             out.write(b);
14         }
15         out.close();
16     }

作者: 闫志军    时间: 2013-12-27 14:08
字符流只能对文本文件进行读取, 他比字节流对文本文件的操作效率高
字节流主要是对非文本文件(如一些媒体文件 :图片,电影,音乐等)进行操作的
       注意:字节流可以对所有类型的文件进行操作。
如果用字节流操作文本文件,没有字符流操作文本文件 效率高。
作者: 75100313    时间: 2013-12-27 14:37
字节流一样可以操作 字符流可以处理的东西  只不过字符流的效率要高一些  其实字符流的底层也是字节流
所以 字节流可以这么理解 就是可以 操作所有文件

我个人理解 字符流 主要是里面有汉字的 需要去查码的  
字节流  是 音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点.
字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;
作者: 松毛    时间: 2013-12-27 14:41
1、当读写文本文件时,使用字符流。因为字符流中有缓冲区,利用缓冲区进行读写更加高效。关于文本文件不光是.txt文件,像.doc、.pdf等需要用到文本的都是属于文本文件吧。这些文件与像媒体文件不同,想mp3,图片等,这些都直接二进制数字组成的。如果使用字符流读写会出现问题,只能用字节流读写(你自己可以尝试一下)。
2、你这个示例中是读写的.txt文本文件,所以可以使用字符流的缓冲区进行读写。这样更加高效。当读写的是文本文件时就可以使用字符流(我个人理解,最简单的就是当你需要使用流对象操作字符串时,就一般使用字符流),除此之外就用字节流。(可能有些废话,但实际情况就是这样{:soso_e113:})。字节流什么文件都可以读写,但是操作文本文件时就没有字符流操作高效,这也是字符流出现的原因。
其实字节流转字符流也要利用字符流的缓冲区高效的特点。
  1. import java.io.BufferedWriter;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.io.OutputStream;

  7. public class Test10 {
  8.        
  9.         public static void main(String[] args) throws IOException {
  10.                  /*File f = new File("d:" + File.separator+"test.txt");
  11.                   //用的字节输出流
  12.                  OutputStream out=new FileOutputStream(f);
  13.                  String str="Hello World";
  14.                  byte[] b=str.getBytes();
  15.                  for(int i=0;i<b.length;i++){
  16.                      out.write(b);
  17.                  }
  18.                  out.close();*/
  19.                 test();
  20.         }
  21.        
  22.         public static void test() throws IOException{
  23.                 File f = new File("d:" + File.separator+"test.txt");
  24.                 BufferedWriter bufw = new BufferedWriter(new FileWriter(f));
  25.                 String str="Hello World";
  26.                 bufw.write(str);  //使用字符流缓冲区更加高效。
  27.                 bufw.close();
  28.         }
  29. }
复制代码





作者: duanyoujiji    时间: 2013-12-28 11:14
对于我们常用的GBK中,英文是占用1个字节,中文是2个。
对于UTF-8,英文是1个,中文是3个 。
对于Unicode,英文中文都是2个。
例:你现在要读一个汉字(以二个字节来存,既:一个字符)的“汉”。
        1.用字符流读:一次读二个字节,那么你就可以完全读取到它,并存到你想存的地方。
        2.用字节流读:一次读一个字节,那么你要读二次你才完全得读取到了这个汉字。不然就读取到了半个(一个汉字二个字节中的一个字节),那你说这半个(一个字节)是什么东西?我想这并不是你想要的吧。
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好。
总而言之,
如果是音频文件、图片、歌曲,就用字节流好点;
如果是关系到中文(文本)的,用字符流好点 。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2