最进看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);
写入文本的数据是一样的。
|
|