IO_字节流_节点流_文件夹拷贝_工具制作_文件后缀与软件的关系JAVA149、163

时间:2023-02-12 21:37:31

来源:http://www.bjsxt.com/
一、S02E149_01IO_字节流、节点流、文件夹拷贝、工具制作、文件后缀与软件的关系
1.文件夹拷贝
a.递归查找子孙级文件或文件夹
b.文件则直接复制(IO流复制);文件夹则创建
c.举例,A拷贝到AA

            A
/ \
a.txt b
|
b.txt
拷贝
AA
|
A
/ \
a.txt b
|
b.txt
(JAVA163)
d.解决:
不能将父目录拷贝到子目录中(解决方法:程序中if(des.getAbsolutePath().contains(src.getAbsolutePath())))
删除超长目录(源目录:G:/java/test/a,目标目录:G:/java/test/a/b,这样递归拷贝,目录超长,无法删除)
(解决方法:下载robocopy,解压后把robocopy.exe所在目录配置到环境变量中。在那个存在超长文件夹所在目录创建一个空目录t,然后格式如Robocopy /MIR storepath longlongpath,
例如robocopy /MIR G:\java\test\t G:\java\test\a
其中上面的longlongpath指的是超长文件夹的文件夹。
在命令行运行,在一阵滚屏后,longlongpath被拷贝成t,也就是说变成一个空目录)
package com.test.io.stream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 3.文件拷贝,程序为桥梁
a.建立联系:File对象 源头和目的地
b.选择流:文件输入流 InputStream FileInputStream
文件输出流 OutputStream FileOutputStream
c.操作:拷贝
byte[] flush = new byte[1024];
int len = 0;
while(-1 != (len = 输入流.read(flush))){
输出流.write(flush,0,len)
}
输出流.flush
d.释放资源:关闭两个流
*/

public class CopyFile {
public static void main(String[] args) {
String srcPath = "G:/java/test/background.jpg";
String desPath = "G:/java/test/100.jpg";
try {
copyFile(srcPath,desPath);
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("文件没有找到");
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件拷贝失败或者关闭流失败");
}
}
/**
* 文件的拷贝,传入File参数
* @param src
* @param des
* @throws FileNotFoundException
* @throws IOException
*/

public static void copyFile(File src,File des) throws FileNotFoundException,IOException {
//1.建立联系 源头(存在且为文件) + 目的地(文件可以不存在)
if(!src.isFile()){
throw new IOException("只能拷贝文件");
}
//des为存在的文件夹,不能建立与文件夹同名的文件
if(des.isDirectory()){
System.out.println(des.getAbsolutePath() + "不能建立与文件夹同名的文件");
throw new IOException(des.getAbsolutePath() + "不能建立与文件夹同名的文件");
}
//2.选择流
InputStream is = new FileInputStream(src);
OutputStream os = new FileOutputStream(des);
//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();
}
/**
* 文件的拷贝,传入String参数,路径
* @param srcPath
* @param desPath
* @throws FileNotFoundException
* @throws IOException
*/

public static void copyFile(String srcPath,String desPath) throws FileNotFoundException,IOException {
copyFile(new File(srcPath),new File(desPath));
}
}
package com.test.io.stream;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
* 文件夹的拷贝
* 1.文件 赋值 copyFile()
* 2.文件夹 创建 mkdirs()
* 3.递归查找子孙级
*/

public class CopyFolder {
public static void main(String[] args) {
//源目录
String srcPath = "G:/java/test/src";//如果写错为文件,因不能建立与文件夹des同名的文件,所以会抛出异常
//目标目录
String desPath = "G:/java/test/des";

if(srcPath.equals(desPath)){//拒绝自己拷贝给自己
System.out.println("拒绝自己拷贝给自己");
return;
}
File src = new File(srcPath);
File des = new File(desPath);
if(src.isDirectory()){//文件夹
des = new File(desPath,src.getName());
if(des.getAbsolutePath().contains(src.getAbsolutePath())){
System.out.println("父目录不能拷贝到子目录中");
return;
}
}
copyFolder(src,des);
}
/**
* 拷贝文件夹
* @param src
* @param des
*/

public static void copyFolder(File src,File des){
if(src.isFile()){//文件
try {
CopyFile.copyFile(src, des);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}else if(src.isDirectory()){//文件夹
//确保目标文件夹存在
des.mkdirs();
//获取下一级目录或文件
for(File sub : src.listFiles()){
copyFolder(sub,new File(des,sub.getName()));
}
}
}
}