黑马程序员技术交流社区

标题: IO看了有点绕,理清一下 [打印本页]

作者: Foundmoon    时间: 2015-6-16 10:25
标题: IO看了有点绕,理清一下
最进看IO,各种流,字符流、字节流、转换流。同样是copy一个文本文件,字符流 代码如下package IO;
import java.io.*;
public class copyDemo
{
        public static void main(String[] args)
        {
                FileWriter fw =null;
                FileReader fr=null;
                char[] chs=new char[1024];
                int x=0;
                try
                {
                long l1=System.currentTimeMillis();
                fr=new FileReader("G:\\IMG_2064.JPG");
                fw=new FileWriter("g:\\2064.JPG");
                while((x=fr.read(chs))!=-1)
                        fw.write(chs,0,x);
                long l2=System.currentTimeMillis();
                System.out.println(l2-l1);
                }
                catch(IOException e)
                {
                        System.out.println(e.toString());               
                }
                finally
                {
                        try
                        {
                        if(fw !=null)
                                fw.close();
                        }
                        catch(IOException e)
                        {
                                System.out.println(e.toString());
                        }
                        try
                        {
                                if(fr!=null)
                                        fr.close();
                        }
                        catch(IOException e)
                        {
                                System.out.println(e.toString());
                        }
                }
        }
}

将FileWriter/FileReader换成FileOutputStream和FileInputStream都可以达到目的,当然程序中的一些中间变量如char数组要改成byte数组等
,而且感觉字节流更快一点,自己也验证了一下,确实快,应该是因为少了查表嘛。

一开始觉得字节流和字符流分的不是很清楚,研究了一下,自己的有一些理解:之所以自己晕菜了,就是因为没有抓住IO在读写的最本质。不论是字节流还是字符流,读写数组都是读写的二级制数,不同在于字符流会将读取的字节,按照系统的默认码表“翻译”成字符,在字符流写的过程是,是将字符按照系统的码表“翻译成”二级制数,写入文件,而字节流读写的都只是二进制数而已。
但是,在复制文本以外的文件时,用字符流就会出现错误,因为字符流在读取过程会遇到码表没有的值 ,“翻译”出了问题,最终写入的数据,和原来的二级制数不一样的,copy失败。
还有一点是,用字节流和字符流写一个文本文件,能够达到相同的目的,前提是知道要写入的字符的编码
                FileWriter fw=new FileWriter("g:\\111111111.txt");
                FileOutputStream fos=new FileOutputStream("g:\\333333333333.txt");
                fw.write(37101);//或者   fw.write(“郭”);
                fos.write(185);
                fos.write(249);

写入文本的数据是一样的。

作者: 腹黑生姜    时间: 2015-6-16 23:12
赞个!赞
作者: 王骥    时间: 2015-6-16 23:32
这个我完全看懵了,谢谢楼主整理
作者: 晓月残魂    时间: 2015-6-17 01:54
赞!!!
作者: 1958078929    时间: 2015-6-17 06:39
赞一个,总结不错
作者: Huan220_欢    时间: 2015-6-29 19:13
学习了~~~
作者: 成佳裕    时间: 2015-6-29 21:16
还看不懂,不过肯定很厉害




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