JAVA复制文件最快的算法
下面列举了两个拷贝文件的算法,第一个使用的是IO流--Buffered流,速度较慢;第二个方法使用的是java.nio.channels.FileChannel的transferTo方法,速度较快。所以推荐第二种方法。
/** * 复制文件 * * @param srcFile * 源文件File * @param destDir * 目标目录File * @param newFileName * 新文件名 * @return 实际复制的字节数,如果文件、目录不存在、文件为null或者发生IO异常,返回-1 */public static long copyFile1(File srcFile, File destDir, String newFileName) {long copySizes = 0;if (!srcFile.exists()) {System.out.println("源文件不存在");copySizes = -1;} else if (!destDir.exists()) {System.out.println("目标目录不存在");copySizes = -1;} else if (newFileName == null) {System.out.println("文件名为null");copySizes = -1;} else {try {BufferedInputStream bin = new BufferedInputStream(new FileInputStream(srcFile));BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(new File(destDir, newFileName)));int b = 0, i = 0;while ((b = bin.read()) != -1) {bout.write(b);i++;}bout.flush();bin.close();bout.close();copySizes = i;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}return copySizes;}/** * 复制文件(以超快的速度复制文件) * * @param srcFile * 源文件File * @param destDir * 目标目录File * @param newFileName * 新文件名 * @return 实际复制的字节数,如果文件、目录不存在、文件为null或者发生IO异常,返回-1 */public static long copyFile2(File srcFile, File destDir, String newFileName) {long copySizes = 0;if (!srcFile.exists()) {System.out.println("源文件不存在");copySizes = -1;} else if (!destDir.exists()) {System.out.println("目标目录不存在");copySizes = -1;} else if (newFileName == null) {System.out.println("文件名为null");copySizes = -1;} else {try {FileChannel fcin = new FileInputStream(srcFile).getChannel();FileChannel fcout = new FileOutputStream(new File(destDir,newFileName)).getChannel();long size = fcin.size();fcin.transferTo(0, fcin.size(), fcout);fcin.close();fcout.close();copySizes = size;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}return copySizes;}