A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

下面是我一开始自己敲了一遍的代码。乍一看没看出任何的错,对照了以前的学长的代码愣是没看出错来。而且思路照理来说应该很正确。
实在是纠结了很久。
public class CopyFiles
{
        public static void main(String[] args)throws IOException
        {
                File yuan=new File("D:\\server");
                File mudi=new File("E:\\server_2");
                if(!mudi.exists())
                {
                        mudi.createNewFile();
                }
                //建立多级文件目录
                mudi.mkdirs();
                //获取所有文件对象
                File[] files=yuan.listFiles();
                for(File file:files)
                {
                                //获取目的文件夹下的目录
                                String mudi_dir=mudi+"\\"+file.getName();
                        if(file.isDirectory())
                        {
                                //获取源文件夹下的目录或文件名
                                String yuan_file=yuan+"\\"+file.getName();
                               
                                //复制目录
                                copyDir(new File(yuan_file),new File(mudi_dir));
                        }
                        else
                        {
                                //复制文件
                                copyFile(file,new File(mudi_dir));
                        }
                }
               
        }
        public static void copyDir(File yuan,File mudi)throws IOException
        {
                mudi.mkdirs();
                File[] files=yuan.listFiles();
                for(File file:files)
                {
                        if(file.isDirectory())
                        {
                                copyDir(new File(yuan+"\\"+file),new File(mudi+"\\"+file.getName()));
                        }
                        else
                        {
                                copyFile(file,new File(mudi+"\\"+file.getName()));
                        }
               
                }
               
        }
        public static void copyFile(File yuan,File mudi)throws IOException
        {
                BufferedInputStream buis=new BufferedInputStream(new FileInputStream(yuan));
                BufferedOutputStream buos=new BufferedOutputStream(new FileOutputStream(mudi.getAbsolutePath()+""));
                byte[] buf=new byte[1024];
                int len=0;
                while((len=buis.read(buf))!=-1)
                {
                        buos.write(buf,0,len);
                        buos.flush();       
                }       
                buis.close();
                buos.close();
        }
}


6 个回复

倒序浏览
运行报错是在 BufferedOutputStream buos=new BufferedOutputStream(new FileOutputStream(mudi.getAbsolutePath()+""));这一行,然后我就使劲的看这一行,用debug模式跑了一下,也是在这一行报错,说是目的的文件没有找到错误。我一开始以为是文件复制的方法错了,于是就单独跑一个复制方法,发现没有任何的问题,于是就想到可能是文件的目录复制错了,没有目录的话,文件也是不能拷贝的
回复 使用道具 举报
然后我再单独跑了一下复制目录的方法,发现也没有任何问题。这时我就想到应该是main方法的调用可能错了
回复 使用道具 举报
因为是复制文件,按理来说最上级目录名应该不影响的,但抱着尝试的态度,我把E:\\server_2改成了E:\\server,
再跑一下,咦,突然可以了,这是怎么回事,难道文件名不同会影响多层文件复制吗,看了下E盘,发现server_2里什么都有,恩,应该就是这样的。
回复 使用道具 举报
server_2里什么都有:L,我意识到不对了,再跑一遍,依然是错的,最后发现罪魁祸首是这个
if(!mudi.exists())
                {
                        mudi.createNewFile();
                }
这个方法创建了一个文件。而不是文件夹。我前面是因为单独跑了一个复制目录的方法,将目录成功复制好了,又跑了一次当然就可以了。最终还是自己对API的方法不熟,逻辑也没理清,引以为戒
回复 使用道具 举报
你在main方法中的 String mudi_dir=mudi+"\\"+file.getName();已经为mudi文件夹添加了一次文件名,到了copyDir方法中又添加了一次,造成重复。

其实你main方法中 从mudi.mkdirs();开始的代码本身就和copyDir中的代码重复。既然已经用了递归,main方法中直接调用copyDir即可
回复 使用道具 举报
fantacyleo 发表于 2015-4-1 10:45
你在main方法中的 String mudi_dir=mudi+"\\"+file.getName();已经为mudi文件夹添加了一次文件名,到了copy ...

对哦,我代码真的重复了,多谢啊,都没发现:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马