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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 date1130 于 2015-1-12 13:06 编辑
  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.io.FileWriter;
  6. import java.io.IOException;

  7. public class CopyFileDemo2 {

  8.         public static void main(String[] args) throws IOException {

  9.                 File srcForder = new File("d:\\");

  10.                 File destForder = new File("d:\\Test\\");

  11.                 isFile(srcForder, destForder);
  12.         }

  13.         private static void isFile(File srcForder, File destForder) throws IOException {

  14.                 if (!destForder.exists())

  15.                         destForder.mkdir();

  16.                 File[] file = srcForder.listFiles();

  17.                 if (file != null) {

  18.                         for (File srcFile : file) {

  19.                                 if (srcFile.isDirectory()) {

  20.                                         isFile(srcFile, destForder);

  21.                                 } else {

  22.                                         if (srcFile.getName().endsWith(".java")) {
  23.                                                 
  24.                                                 File destFile = new File (destForder,srcFile.getName()) ;

  25.                                                 copyFile(srcFile, destFile);
  26.                                         }
  27.                                 }
  28.                         }
  29.                 }
  30.         }

  31.         private static void copyFile(File srcFile, File destFile) throws IOException {

  32.                 BufferedReader br = new BufferedReader(new FileReader(srcFile));

  33.                 BufferedWriter bw = new BufferedWriter(new FileWriter(destFile)) ;

  34.                 String line = null ;

  35.                 while ((line = br.readLine()) != null) {

  36.                         bw.write(line);
  37.                         bw.newLine();
  38.                         bw.flush();
  39.                 }

  40.                 br.close();
  41.                 bw.close();
  42.         }
  43. }
复制代码

麻烦大神找一下错误,实在看不出程序哪里写的有问题,我想遍历D盘目录下,所有的文件夹,找到.java文件,统一复制到D:盘test目录。复制期间没有任何问题,但是当复制结束后,所有的java文件,全部变成了0kb了。想请教大神。。
在复制期间,都没问题发,但是程序运行完毕的那一个瞬间,所有文件大小全部成了0kb,就在那一瞬间,为啥。。。。

QQ图片20150112073756.jpg (176.11 KB, 下载次数: 13)

QQ图片20150112073756.jpg

评分

参与人数 1技术分 +2 收起 理由
杨佳名 + 2

查看全部评分

19 个回复

倒序浏览
你这个还真没看出有什么问题,而且我运行了一下也好使 没出现你说的那种情况重试或刷新一下看看..
回复 使用道具 举报
我今天刚看了IO的第一天视频
你都用缓冲区了
为什么不用readLine()方法

评分

参与人数 1黑马币 +4 收起 理由
date1130 + 4 谢谢提醒。。

查看全部评分

回复 使用道具 举报
xiaoyi 发表于 2015-1-11 18:30
我今天刚看了IO的第一天视频
你都用缓冲区了
为什么不用readLine()方法

谢谢提醒。。:P
回复 使用道具 举报
本帖最后由 date1130 于 2015-1-12 07:47 编辑
Gonnaloveu 发表于 2015-1-11 17:35
你这个还真没看出有什么问题,而且我运行了一下也好使 没出现你说的那种情况重试或刷新一下看看.. ...

你是不是把源目录给修改成了非根目录?
回复 使用道具 举报
date1130 发表于 2015-1-12 07:45
你是不是把源目录给修改成了非根目录?

= = 你咋知道的 大神啊 文件太多不改不爆掉了么..:L

评分

参与人数 1黑马币 +4 收起 理由
date1130 + 4 因为我放在非根目录就是可以的。。。.

查看全部评分

回复 使用道具 举报
我还没看到IO,但是我认为是这个问题 ,有错误,你怎么编译通过的啊!
String line = null ;
while ((line = br.readLine() != null)
,你的while里面,先执行 br.readLine() != null,后赋值,line是String,你while编译没报错
我改成while ((line = br.readLine()).length()>0)
运行结果如下:

11.png (5.31 KB, 下载次数: 0)

11.png
回复 使用道具 举报
这是比较多的一个

11.png (143.12 KB, 下载次数: 0)

11.png
回复 使用道具 举报
本帖最后由 date1130 于 2015-1-12 13:08 编辑
邓士林 发表于 2015-1-12 12:29
我还没看到IO,但是我认为是这个问题 ,有错误,你怎么编译通过的啊!
String line = null ;
while ((lin ...

莫激动,我手动改代码的时候,少写了右半个个括号。你运行的时候,源,放的应该不是磁盘根目录吧,放到磁盘根目录你再试试。。
回复 使用道具 举报
邓士林 发表于 2015-1-12 12:37
这是比较多的一个

你现在再运行一遍我修改后的代码,源路径要改也改成磁盘根路径,试试可以吗,等回复。。莫非我电脑有问题?
回复 使用道具 举报
本帖最后由 bowen-xiao 于 2015-1-12 13:25 编辑
  1.    while ( (line = br.readLine())!= null) {
  2.                         if( !line.isEmpty()){
  3.                         System.out.println( br.readLine());
  4.                         bw.write(line);
  5.                         bw.newLine();
  6.                         bw.flush();
  7.                         }
  8.                 }
复制代码


这里要做先层判断,要先判断是否为null,再判断字符是否为空的时候再写。

QQ截图20150112132324.png (3.99 KB, 下载次数: 0)

这只是一个空指针异常,写出时的内容为空

这只是一个空指针异常,写出时的内容为空

评分

参与人数 1黑马币 +4 收起 理由
date1130 + 4 未解决问题,参与有奖哈。。

查看全部评分

回复 使用道具 举报
你看图吧!我操作都截图了,

根目录.png (61.01 KB, 下载次数: 0)

根目录

根目录

测试.png (28.99 KB, 下载次数: 0)

测试.png

test.png (87.54 KB, 下载次数: 0)

test.png

评分

参与人数 1黑马币 +8 收起 理由
date1130 + 8 莫非我电脑真有问题???

查看全部评分

回复 使用道具 举报
这个不知道,以前写C#的时候,直接对根目录下操作,是不允许的,但是java的可以呢?你的为什么呢?
回复 使用道具 举报
本帖最后由 bowen-xiao 于 2015-1-12 15:48 编辑
bowen-xiao 发表于 2015-1-12 13:21
这里要做先层判断,要先判断是否为null,再判断字符是否为空的时候再写。 ...

亲手运行,问题可以解决。
再修改这里就可以了
  1. BufferedWriter bw =    new BufferedWriter(new OutputStreamWriter(new FileOutputStream(destFile, true), "UTF-8"));
复制代码



test.png (99.53 KB, 下载次数: 0)

test.png

test.png (99.53 KB, 下载次数: 0)

test.png
回复 使用道具 举报
本帖最后由 Gonnaloveu 于 2015-1-12 15:38 编辑

我好像明白了 你扫描D盘然后复制到D盘可能会出现一个类似并发修改异常的死循环导致的,具体为什么是0字节我也不太清楚 但是我刚扫描D根目录复制到G盘是好使的 ,图下是我猜测0字节的原因可以看看. 下面是我的猜测不一定对:复制的时候他是两边跑在原地址看到文件信息(如文件名文件类型)后到目标路径创建文件然后再回来根据信息找这个文件要复制它的内容,由于你复制完的文件也在D盘,所以他就把新生成的文件当成要复制的了,然而里面没有内容所以就一直是0字节...
至于为什么同名找的不是原来的文件而是新建的文件 我想有两种可能:
一是因为他是一层一层找的因为Test只有一层文件夹所以他比较"浅"更容易找到.
二是因为他是按根目录文件夹一个一个往里翻Test正好在其他文件夹上面.
纯属瞎想 实际请问高人

回复 使用道具 举报
仔细学习并运行了下,确实可以运行,而且结果也是对的。

捕获.PNG (58.32 KB, 下载次数: 0)

捕获.PNG

2p.PNG (191.18 KB, 下载次数: 0)

2p.PNG
回复 使用道具 举报
date1130 发表于 2015-1-12 07:45
你是不是把源目录给修改成了非根目录?

看15楼我在那瞎说了一些话没准是对的...{:3_52:}

评分

参与人数 1黑马币 +8 收起 理由
date1130 + 8 高!!!

查看全部评分

回复 使用道具 举报
bowen-xiao 发表于 2015-1-12 15:15
亲手运行,问题可以解决。
这个代码只能拷贝一个文件,不能复制出所有文件。 ...
  1. BufferedWriter bw =    new BufferedWriter(new OutputStreamWriter(new FileOutputStream(destFile, true), "UTF-8"));
复制代码


把这段修改下应该就可以了。
回复 使用道具 举报
Gonnaloveu 发表于 2015-1-12 15:18
我好像明白了 你扫描D盘然后复制到D盘可能会出现一个类似并发修改异常的死循环导致的,具体为什么是0字节我 ...
  1. BufferedWriter bw =    new BufferedWriter(new OutputStreamWriter(new FileOutputStream(destFile, true), "UTF-8"));
复制代码


改下这段代码试试,会出现一个你想都想不到的问题,而且问题出得很随机。
回复 使用道具 举报
看我的吧,大概思想和你一样
  1. /*
  2. * 1.编写一个程序,把一个目录里边的所有带.java文件拷贝到另一个目录中,拷贝成功后,
  3. * 把后缀名是.java的文件改为.txt文件。(要求有思路,有注释,有代码,需要注意的是:这个是先拷贝,拷贝成功后才可以改后缀名的)
  4. */
  5. import java.io.*;
  6. public class CopyDirs {

  7.         public static void main(String[] args) throws IOException {

  8.                 File f1 = new File("a");
  9.                 File f2 = new File("b");
  10.                 CD(f1,f2);
  11.                
  12.         }
  13.        
  14.         public static void CF(File f1,File f2) throws IOException
  15.         {
  16.                 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f1));
  17.                 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(f2));
  18.                 int len;
  19.                 byte[] buf = new byte[1024];
  20.                 while((len = bis.read(buf))!= -1)
  21.                 {
  22.                         bos.write(buf,0,len);
  23.                         bos.flush();
  24.                 }
  25.                 bis.close();
  26.                 bos.close();
  27.         }
  28.         public static void CD(File f1,File f2) throws IOException
  29.         {
  30.                 if(f1.isDirectory())
  31.                 {
  32.                         if(!f2.exists())
  33.                         {
  34.                                 f2.mkdir();
  35.                         }
  36.                 }
  37.                 File[] fs = f1.listFiles();
  38.                 for(File f: fs)
  39.                 {
  40.                         //需要注意的是:这个是先拷贝,拷贝成功后才可以改后缀名的
  41.                         if(f.isFile())
  42.                         {
  43.                                 if(f.getName().endsWith("java"))
  44.                                 {
  45.                                         String j = f.getName();
  46.                                         String jj = f2.getPath()+f.separator+j;
  47.                                         File fn =new File(jj);
  48.                                         CF(f,fn);
  49.                                         String n = jj.subSequence(0, j.length()-4)+".txt";
  50.                                         File fn1 = new File(n);
  51.                                         fn.renameTo(fn1);
  52.                                 }
  53.                                 else
  54.                                 {
  55.                                         String j = f.getName();
  56.                                         String jj = f2.getPath()+f.separator+j;
  57.                                         File fn = new File(jj);
  58.                                         CF(f,fn);
  59.                                 }
  60.                         }
  61.                         if(f.isDirectory())
  62.                         {
  63.                                 String j = f.getName();
  64.                                 String jj = f2.getPath()+f.separator+j;
  65.                                 File fn = new File(jj);
  66.                                 CD(f,fn);
  67.                         }
  68.                 }
  69.         }
  70.        
  71. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马