字节流
输入流:InputStream,FileInputStream | read(byte[] b),read(byte[] b, int off, int len)+close
输出流:OutputStream,FileOutputStream | write(byte[] b),write(byte[] b, int off, int len)+close
我们用字节流的输入流和输出流来实现拷贝文件:
public class FileUtil {
//目录文件路径
public static void copyFile(String srcPath, String destPath) throws IOException {
copyFile(new File(srcPath),new File(destPath));
}
/**
* 拷贝文件
* @param src 源文件
* @param dest 目标文件
* @throws IOException
*/
public static void copyFile(File src, File dest) throws IOException {
//1.建立联系 源(存在且为文件)+ 目的地(文件可以不存在)
if (! src.isFile()){
System.out.println("只能拷贝文件!");
throw new IOException("只能拷贝文件!");
}
//dest为已经存在的文件夹,不能建立与文件夹同名的文件
if (!src.isDirectory()){
System.out.println("不能建立与文件夹同名的文件!");
throw new IOException("不能建立与文件夹同名的文件!");
}
//2.选择流
InputStream is = new BufferedInputStream(new FileInputStream(src));
OutputStream os = new BufferedOutputStream(new FileOutputStream(dest));
//3.文件的拷贝 循环+读取+写出
byte[] flush = new byte[1024];
int len = 0;
//读取
while (-1 != (len=is.read(flush))){
//写出
os.write(flush,0,len);
}
os.flush();
//关闭两个流--先打开的后关闭
os.close();
is.close();
}
/**
* 拷贝文件夹
* @param srcPath 源路径
* @param destPath 目标路径
*/
public static void copyDir(String srcPath, String destPath){
File src = new File(srcPath);
File dest = new File(destPath);
copyDirDetail(src, dest);
}
/**
* 拷贝文件夹
* @param src 源目录
* @param dest 目标目录
*/
public static void copyDir(File src, File dest){
if (src.isDirectory()){ //文件夹
dest = new File(dest, src.getName());
if (dest.getAbsolutePath().contains(src.getAbsolutePath())){
System.out.println("父目录不能拷贝到子目录中!");
return;
}
}
copyDirDetail(src, dest);
}
/**
* 拷贝文件夹细节
* @param src 源文件
* @param dest 目标文件
*/
public static void copyDirDetail(File src, File dest){
if (src.isFile()){//文件
try {
FileUtil.copyFile(src, dest);
} catch (IOException e) {
e.printStackTrace();
System.out.println("拷贝文件失败!");
}
} else if (src.isDirectory()){//文件夹
//确保目标文件夹失败
dest.mkdirs();
//获取下一级目录|文件
for (File sub:src.listFiles()){
copyDirDetail(sub, new File(dest, sub.getName()));
}
}
}
}
以上就可以实现文件的拷贝。