【JAVA开发之IO流1-2】IO流中的字符流和字节流

来源:互联网 发布:腾达路由器mac地址过滤 编辑:程序博客网 时间:2024/06/01 09:45

IO流在方向上可以分为输入流和输出流,而在传输方式上又可分为:字符流、字节流。

什么是字符,什么是字节呢?

1个汉字就是一个字符,为2字节,类似的包括全角标点、全角英文字母、日语假名之类的。

1个英文字母也是一个字符,为1字节,类似的包括英文标点之类的。

简单来说,1字节就是1字节,而1字符可以是1字节可以是2字节可以是4字节

字节是ASCII值多少的单位,1个字节等于8位二进制数。

字符是我们可以辨认出的字、符号的单位。


知道什么是字符、字节了,那我们来看看字符流和字节流吧,

字符流包括:java.io.FileWriter,java.io.FileReader等。

它们只能读取写入文本文件,如果用它们读取写入视频、音频、图片的话,会把原先一字节一字节的编码误以为是字符,就把文件破坏掉了。

字节流包括:java.io.FileInputStream,java.io.FileOutputStream等。

它们可以读取写入任何文件,但是无法识别其中的文本,因为这些流无法把字节识别为字符,所以使用它们可以读取写入任何文件,但是无法识别其中的内容。


字节流和字符流的区别在于,字节流效率慢、字符流效率稍微快一点点,字符流只能读取写入识别文本文件,字节流可以读取写入任何文件,但无法识别。简单来说:文本用字符流,其它用字节流。


关于字符流可以参考另一个例子:字符流的使用

下面写一个小例子理解一下字节流:利用字节输出流,和字节输入流,把D:\Demo.gif 复制到E盘根目录下并改名字为DemoCopy.gif(可以修改代码复制任意文件),代码如下:

import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class IOStream {    public static void main(String[] args) throws IOException {//异常可以用try/cache处理,这里我们直接扔出来        /**         * 建立一个输入字节流(in)和一个输出字节流(out)         * 并指定in的读取路径和out的写入路径         * in负责读取硬盘上的文件到内存,相当于Windows里的复制         * out负责从内存上写入到硬盘,相当于windows里的粘贴         * */        FileInputStream in=new FileInputStream("D:/Demo.gif");//要复制的文件路径,必须要存在,否则出现找不到文件的异常        FileOutputStream out=new FileOutputStream("E:/DemoCopy.gif");//要粘贴的文件路径,最好不存在,如果存在会被覆盖        /**         * 在while循环中,用一个整形变量aa一个一个接收read方法读取到的ASCII值         * 并用输出流将aa写入新文件,直到ASCII值为-1(即什么都没有的时候,文件尾)         * */        int aa=in.read();//将第一个读取的ASCII值存入内存        while (aa!=-1) {            out.write(aa);            aa = in.read();        }        out.flush();//将最后一个读取的ASCII值从内存缓冲区写入硬盘        /**         * 关闭两个流         * */        in.close();        out.close();        System.out.println("复制成功!!");//这个Dome没有用try/cache处理异常,所以不成功会直接出现异常    }}
大家可以用字符流(FileWriter和FileReader)替换掉上面的字节流(FileInputStream和FileOutputStream),用字符流进行复制,结果文件是损坏的


0 0
原创粉丝点击