关于io流自己做例子,复制乱码和重复复制,遇到了难以解决的问题,请大家帮我解答一下感激不尽

qq_42143348 2020-05-05 07:38:17
都是关于文件复制的,一个是字符流,一个是字节流
字符流然后结果复制后的文件乱码
字节流的是一个实例,
public static void copyDirectory() throws IOException {
Scanner sc=new Scanner(System.in);
System.out.println("请输入源目录位置:");
String srcPath=sc.nextLine();//从控制台获取路径
File srcFile=new File(srcPath);
System.out.println("请输入目标位置:");
String destPath=sc.nextLine();//从控制台获取路径
File destFile=new File(destPath);
//将源路径中的内容复制到目标路径下
FileUtils.copySrcPathTODestPath(srcFile,destFile);
}
public static void copySrcPathTODestPath(File srcFile,File destFile) throws IOException {
//创建目的地文件夹
destFile.mkdirs();/*创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。*/
//获取源路径中的所有File对象
File[] files=srcFile.listFiles();
for (File file:files
) {
File dest=new File(destFile,file.getName());
//判断当前file对象是否为目录
if(file.isDirectory()){
//通过递归,完成复制目录
copySrcPathTODestPath(file,dest);
}else{
//复制文件
FileInputStream in=new FileInputStream(file);
FileOutputStream out=new FileOutputStream(dest);
//读
byte[] bys=new byte[1024];
int len=0;
while((len=in.read(bys))!=-1){
//写
out.write(bys,0,len);
}
//关闭流
in.close();
out.close();

}

}
}

当我设置好源目录和目标目录的执行的时候
目标目录如果是源目录的子文件夹就会无限复制,最后炸掉,我猜可能是递归的问题,但我不知道怎么解决他。
正常: 源目录 :F:\api 目标目录: D:\Program Files
无限复制:源目录:D:\Program Files\Java 目标目录:D:\Program Files\Java\123
求大神帮帮我。感激不尽
...全文
136 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
YangjulongTrue 2020-05-05
  • 打赏
  • 举报
回复
无限复制:源目录:D:\Program Files\Java 目标目录:D:\Program Files\Java\123
应该是 你这边 源目录 复制了原来的完了 但是你下面又有一个目录 123 又去复制这个 目录 然后不断复制 里面有的东西 出不来
可以判断你的 copySrcPathTODestPath(File srcFile,File destFile) 里的srcfile是不是你新的创建的目录是直接return去 避免无用的复制
qybao 2020-05-05
  • 打赏
  • 举报
回复
字符流是有编码的,你的系统默认的编码是什么?
你可以用System.out.println(System.getProperty("file.encoding"));来看生成文件会默认采用的编码,再用 另存为 的方式查看你的src.txt的编码,看看是否一致?
如果编码不一致,你可以采用带编码的字符流,即(假设编码为GBK)
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("src.txt"), "GBK"));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("copy.txt"), "GBK"));

至于字节流的例子,如果目标文件夹是源文件夹的子文件夹,你要把它从源文件的对象中去掉,否则就相当于自己复制自己(而且自己因为从源文件复制内容过来而不断再刷新),这样的自己复制自己每个尽头,最终就会溢出。
改为

if(file.isDirectory() && ! file.getAbsolutePath().equals(dest.getAbsolutePath())){ //如果不是子文件夹自己才递归
//通过递归,完成复制目录
copySrcPathTODestPath(file,dest);







62,614

社区成员

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

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