IO流 拷贝目录代码运行问题

Napolitain 2020-11-04 07:36:50
求大神指点:这个拷贝目录的的代码虽然能把文件都拷贝但会发生运行错误,请问是具体的错误是什么?
我觉得应该是递归引起的错误,求能人指点指点。

import java.io.*;

public class CopyDir {
public static void copyDirector(File needCopy,File putPath){
String name = needCopy.getName(); //目录名字
File[] sub = needCopy.listFiles(); //目录下的子文件
String path = putPath.getAbsolutePath() ;//目标的绝对路径

File makePath = new File(path+"\\"+name); //需要被创造的目录
makePath.mkdir();//创造目录
String newPath = makePath.getAbsolutePath(); //被创造目录的绝对路径


if(sub.length == 0){
return;
}

FileInputStream a1 = null;
FileOutputStream b2 = null;
for(File temp : sub){
String tempName = temp.getName(); //子文件的名字

if(temp.isDirectory()){
copyDirector(temp,makePath);
}
try {
a1 = new FileInputStream(temp);
b2 = new FileOutputStream(newPath+"\\"+tempName);
byte[] x = new byte[1024*1024];
int readCound = 0;
while ((readCound=a1.read(x)) != -1){
b2.write(x,0,readCound);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
a1.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
b2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}
}

错误信息:
java.io.FileNotFoundException: 文件的绝对路径 (拒绝访问。)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:212)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:154)
at com.LiuZeShen.JavaSE.Copy.CopyDir.copyDirector(CopyDir.java:29)
...全文
2509 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kk1924 2020-12-21
  • 打赏
  • 举报
回复



但是你需要协助的话,可以找我,,哈哈哈哈
kk1924 2020-12-21
  • 打赏
  • 举报
回复
哈哈哈哈,,说不定真的就是没有权限,,,,
kk1924 2020-11-30
  • 打赏
  • 举报
回复
看情况,有可能是没有读写权限
qq_39936465 2020-11-05
  • 打赏
  • 举报
回复
引用 楼主 Napolitain 的回复:
求大神指点:这个拷贝目录的的代码虽然能把文件都拷贝但会发生运行错误,请问是具体的错误是什么? 我觉得应该是递归引起的错误,求能人指点指点。
你下面一句只是获取了目录名字,并不包含路径 String name = needCopy.getName(); //目录名字 所以下面的语句可能会出错 File[] sub = needCopy.listFiles(); //目录下的子文件 在生成file名数组时也要给目录添加完整的路径,不然会找不到该目录,所以文件也会找不到。
Napolitain 2020-11-05
  • 打赏
  • 举报
回复
引用 2 楼 shpery 的回复:
传参File putPath改成String path,传入值直接传路径试下
改传参不能解决,还是一样的问题,不过我在foreach循环中加了if语句判断是否文件,就没问题了。还是谢谢你了。
        for(File temp : sub){
            String tempName = temp.getName();//子文件的名字

            if(temp.isDirectory()){
                copyDirector(temp,makePath);
            }
            if(temp.isFile()){
                try {
                    a1 = new FileInputStream(temp);
                    b2 = new FileOutputStream(newPath+"\\"+tempName);
                    byte[] x = new byte[1024*1024];
                    int readCound = 0;
                    while ((readCound=a1.read(x)) != -1){
                        b2.write(x,0,readCound);
                    }
                    b2.flush();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    try {
                        a1.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    try {
                        b2.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
Napolitain 2020-11-05
  • 打赏
  • 举报
回复
引用 1 楼 捏造的信仰的回复:
楼主要学会贴代码:

正确的代码是这样的:
public class Hello {
private String name;
}
第一次发帖学到了,谢谢
shpery 2020-11-05
  • 打赏
  • 举报
回复
传参File putPath改成String path,传入值直接传路径试下
捏造的信仰 2020-11-05
  • 打赏
  • 举报
回复
楼主要学会贴代码:

正确的代码是这样的:
public class Hello {
private String name;
}
冰思雨 2020-11-05
  • 打赏
  • 举报
回复
观看异常信息,觉得应该是权限问题。 你的程序访问硬盘文件,是需要访问权限的。 权限一般分为 读取,写入 和更改。 复杂一点的操作系统的权限还和用户组有关。 windows系统还要注意目录权限是否启动了递归传递。
Napolitain 2020-11-05
  • 打赏
  • 举报
回复
引用 5 楼 qq_39936465 的回复:
[quote=引用 楼主 Napolitain 的回复:]求大神指点:这个拷贝目录的的代码虽然能把文件都拷贝但会发生运行错误,请问是具体的错误是什么? 我觉得应该是递归引起的错误,求能人指点指点。
你下面一句只是获取了目录名字,并不包含路径 String name = needCopy.getName(); //目录名字 所以下面的语句可能会出错 File[] sub = needCopy.listFiles(); //目录下的子文件 在生成file名数组时也要给目录添加完整的路径,不然会找不到该目录,所以文件也会找不到。[/quote] 抱歉没说清楚。 我在另一个类调用copyDirector时会将: 需要被复制的目录的绝对路径String needCopy 和 需要被复制到的位置的绝对路径String putPath转为 File needCopy和File putPath对象传入这个方法 所以生成的file数组是需要被复制的目录的file数组(已经存在的目录) String name = needCopy.getName(); 获得的name是为了在目标位置创建相同名字的目录时用的,即mkdir( );时用的。

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧