Java的 io流( 二 )


练习-文件拷贝
注意,这次是小文件的拷贝
public static void main(String[] args) throws IOException {//负责原文件的读取FileInputStream fis=new FileInputStream("D:\\我的世界\\a1.txt");//负责copy文件的写出FileOutputStream fos=new FileOutputStream("D:\\我的世界\\copy.txt");int b;//记录读取内容//边读边写while ((b=fis.read())!=-1){fos.write(b);}fos.close();fis.close();}
public static void main(String[] args) throws IOException {//负责原文件的读取FileInputStream fis=new FileInputStream("D:\\我的世界\\页面返回顶部.mp4");//负责copy文件的写出FileOutputStream fos=new FileOutputStream("D:\\我的世界\\copy.mp4");int b;//记录读取内容//边读边写long l1 = System.currentTimeMillis();while ((b=fis.read())!=-1){fos.write(b);}fos.close();fis.close();long l2=System.currentTimeMillis();System.out.println(l2-l1);}
字节输入流一次读取多个字节 方法名说明
int read()
一次读取一个字节数据
int read(byte[ ] )
一次读取一个字节数组数据
注意:一次读取一个字节数组的数据,每次读取会尽可能把数组装满
所以,在创建字节数组时,一般会用1024的整数倍
1024 * 1024 * 5就是5M
public static void main(String[] args) throws IOException {//a1.txt:abcdeFileInputStream fis=new FileInputStream("D:\\我的世界\\a1.txt");byte[] arr=new byte[2];//长度为2的数组,用read读取时一次可以读取两个//读取的返回值:本次读取到了多少个字节数据int read = fis.read(arr);System.out.println(read);//而且,read用数组读取会把本次读取到的数据放到数组中String str=new String(arr);System.out.println(str);//2//abfis.close();//第二次读取便会依次向后读取两个数据,跟read没有参数时一样//结果是//2//cd//第三次读取的结果是//1//ed,因为第三次读取的时候只剩一个数据未读取,//而read方法在读取时会把数据放到数组中,每次读取都会覆盖原本的数据//所以第三次读取时只读取一个,也就只覆盖一个数据,第二个没有覆盖//也就是 ed}
e覆盖掉c,后面没有数据,所以d没有被覆盖
解决方案:
使用new 时,传递三个参数,第一个表示数组,第二个表示起始索引,第三个表示结束索引,然后会起始索引截取到结束索引
new (arr,0,len)
public static void main(String[] args) throws IOException {//a1.txt:abcdeFileInputStream fis=new FileInputStream("D:\\我的世界\\a1.txt");byte[] arr=new byte[2];//长度为2的数组,用read读取时一次可以读取两个//读取的返回值:本次读取到了多少个字节数据int read1 = fis.read(arr);System.out.println(read1);//而且,read用数组读取会把本次读取到的数据放到数组中String str1=new String(arr,0,read1);System.out.println(str1);//2//ab//第二次读取便会依次向后读取两个数据,跟read没有参数时一样int read2 = fis.read(arr);System.out.println(read2);String str2=new String(arr,0,read2);System.out.println(str2);//结果是//2//cd//第三次读取的结果是int read3 = fis.read(arr);System.out.println(read3);String str3=new String(arr,0,read3);System.out.println(str3);//1//ed,因为第三次读取的时候只剩一个数据未读取,//而read方法在读取时会把数据放到数组中,每次读取都会覆盖原本的数据//所以第三次读取时只读取一个,也就只覆盖一个数据,第二个没有覆盖//也就是 edfis.close();}
public static void main(String[] args) throws IOException {//负责原文件的读取FileInputStream fis=new FileInputStream("D:\\我的世界\\页面返回顶部.mp4");//负责copy文件的写出FileOutputStream fos=new FileOutputStream("D:\\我的世界\\copy.mp4");int b;//记录读取长度//边读边写long l1 = System.currentTimeMillis();byte[]arr=new byte[1024*1024];while ((b=fis.read(arr))!=-1){//此时每一次读取的数据在数组中fos.write(arr,0,b);//这里最后一次读取可以装不满数组,// 所以要用三个参数,表示上面有多少,就写入多少}fos.close();fis.close();long l2=System.currentTimeMillis();System.out.println(l2-l1);}