FileCopy
/*【入】指的是到内存里,【出】指的是到内存外*/ import java.io.*; public class MyReadFile{ public static void main(String[] args){ try{ /*第一步,定位数据源&&目标文件*/ File f = new File("D:/lab_2/test.txt"); File f2 = new File("D:/lab_2/test2.txt"); /*第二步,建立输入&&输出管道*/ FileInputStream fis = new FileInputStream(f); FileOutputStream fos = new FileOutputStream(f2); /*第三步,操作管道*/ for(;fis.available() > 0;) fos.write(fis.read()); }catch(Exception e){} } }
由于是一个字节一个字节的读写,在文件稍微大一点的时候(大于1MB)时,速度会非常的慢。
稍作修改即可,每次1000个字节读写。
byte[] tmp = new byte[1000]; for(;fis.available() > 0;) fis.read(tmp); fos.write(tmp);
据说2的n次方计算机处理效率会更快。
byte[] tmp = new byte[8192]; for(;fis.available() > 0;) fis.read(tmp); fos.write(tmp);
最后是标准版。
/*第三步,操作管道*/ byte[] tmp = new byte[8192]; //处理大部分内容 int length = fis.available()/8192; for(int i = 0; i < length; i ++){ fis.read(tmp); fos.write(tmp); } //处理最后剩下的内容 int size = fis.read(tmp); fos.write(tmp, 0, size);
/*
*/
import java.io.*; public class MyReadFile{ public static void main(String[] args){ try{ /*定位数据源&&定位目标文件*/ File f = new File("D:/lab_2/test.txt"); File f_copy = new File("D:/lab_2/test2.txt"); /*建立将数据从硬盘输入到内存的管道 &&建立将数据从内存输出到硬盘的管道*/ FileInputStream fis = new FileInputStream(f); FileOutputStream fos = new FileOutputStream(f_copy); /*操作管道---->传输数据*/ byte[] tmp = new byte[8192]; /*建立一个临时的array用于一次性大量读写,提高读写大文件的效率*/ /*********复制大部分数据******假设总共有8192+1024byte*****/ int length = fis.available()/8192; /*根据假设length = 1*/ /*这里除完后会有余数(长度小于8192),也就是会剩下一段数据读不到, 如果int length = fis.available()/8192 + 1;多读一次的话, 结果复制的文件会比源文件大,因为实际剩余的长度不足8192。*/ for(int i = 0; i < length; i ++){ fis.read(tmp); fos.write(tmp); } /*根据假设复制了8192byte*/ /**********复制剩下的数据**********根据假设还有1024byte***********/ int left_length = fis.available(); /*根据假设left_length = 1024*/ fis.read(tmp, 0, left_length); fos.write(tmp, 0, left_length); /*根据假设复制了1024byte*/ }catch(Exception e){} } }