黑马程序员技术交流社区

标题: 送技术分,求大神,这个程序哪里有问题呢? [打印本页]

作者: date1130    时间: 2015-1-11 16:36
标题: 送技术分,求大神,这个程序哪里有问题呢?
本帖最后由 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, 下载次数: 9)

QQ图片20150112073756.jpg

作者: Gonnaloveu    时间: 2015-1-11 17:35
你这个还真没看出有什么问题,而且我运行了一下也好使 没出现你说的那种情况重试或刷新一下看看..
作者: xiaoyi    时间: 2015-1-11 18:30
我今天刚看了IO的第一天视频
你都用缓冲区了
为什么不用readLine()方法
作者: date1130    时间: 2015-1-12 07:43
xiaoyi 发表于 2015-1-11 18:30
我今天刚看了IO的第一天视频
你都用缓冲区了
为什么不用readLine()方法

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

你是不是把源目录给修改成了非根目录?
作者: Gonnaloveu    时间: 2015-1-12 10:59
date1130 发表于 2015-1-12 07:45
你是不是把源目录给修改成了非根目录?

= = 你咋知道的 大神啊 文件太多不改不爆掉了么..:L
作者: 邓士林    时间: 2015-1-12 12:29
我还没看到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

作者: 邓士林    时间: 2015-1-12 12:37
这是比较多的一个

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

11.png

作者: date1130    时间: 2015-1-12 13:05
本帖最后由 date1130 于 2015-1-12 13:08 编辑
邓士林 发表于 2015-1-12 12:29
我还没看到IO,但是我认为是这个问题 ,有错误,你怎么编译通过的啊!
String line = null ;
while ((lin ...

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

你现在再运行一遍我修改后的代码,源路径要改也改成磁盘根路径,试试可以吗,等回复。。莫非我电脑有问题?
作者: bowen-xiao    时间: 2015-1-12 13:21
本帖最后由 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)

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

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

作者: 邓士林    时间: 2015-1-12 13:53
你看图吧!我操作都截图了,

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

根目录

根目录

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

测试.png

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

test.png

作者: 邓士林    时间: 2015-1-12 14:48
这个不知道,以前写C#的时候,直接对根目录下操作,是不允许的,但是java的可以呢?你的为什么呢?
作者: bowen-xiao    时间: 2015-1-12 15:15
本帖最后由 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:18
本帖最后由 Gonnaloveu 于 2015-1-12 15:38 编辑

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


作者: Piaoyu    时间: 2015-1-12 15:23
仔细学习并运行了下,确实可以运行,而且结果也是对的。

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

捕获.PNG

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

2p.PNG

作者: Gonnaloveu    时间: 2015-1-12 15:37
date1130 发表于 2015-1-12 07:45
你是不是把源目录给修改成了非根目录?

看15楼我在那瞎说了一些话没准是对的...{:3_52:}
作者: bowen-xiao    时间: 2015-1-12 15:45
bowen-xiao 发表于 2015-1-12 15:15
亲手运行,问题可以解决。
这个代码只能拷贝一个文件,不能复制出所有文件。 ...
  1. BufferedWriter bw =    new BufferedWriter(new OutputStreamWriter(new FileOutputStream(destFile, true), "UTF-8"));
复制代码


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


改下这段代码试试,会出现一个你想都想不到的问题,而且问题出得很随机。
作者: wangcongwu    时间: 2015-1-14 12:34
看我的吧,大概思想和你一样
  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. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2