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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 想要那片海 于 2015-5-3 21:40 编辑

编写程序,将指定目录下所有.java文件拷贝到另一个目的中,并将扩展名改为.txt


我的运行结果总是提示复制文件错误,应该是在流写入过程出现错误,请问应该怎么改正呢?


1.jpg (155.74 KB, 下载次数: 8)

代码1

代码1

2.png (143.54 KB, 下载次数: 15)

代码2

代码2

11 个回复

正序浏览
我们基础班的学生还没有学到!但是也弄出来了

package com.itheima;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Test9 {

        public static void main(String[] args) {
                // 封装源目录
                File fileOrigin = new File("D:\\传智播客\\java");

                // 封装指定目录
                File fileNew = new File("D:\\传智播客\\java\\文件");

                // 判断指定目录是否存在,不存在就创建目录
                if (!fileNew.exists()) {
                        fileNew.mkdir();
                }

                // 调用方法
                Copy(fileOrigin, fileNew);
                System.out.println("复制完毕!");

        }

        public static void Copy(File fileOrigin, File fileNew) {
                // 获取源目录下所有的文件及目录
                File[] fs = fileOrigin.listFiles();
                for (File file : fs) {
                        // 判断是否是文件并且后缀是.java
                        if (file.isFile() && file.getName().endsWith(".java")) {
                                try {
                                        String str = file.getPath();
                                        FileInputStream in = new FileInputStream(str);
                                        str = file.getName();
                                        str = str.substring(0, str.length() - 5);
                                        str += ".txt";
                                        FileOutputStream out = new FileOutputStream(fileNew + "\\"
                                                        + str);
                                        // 一次读取一个字节:
                                        int n = 0;
                                        while ((n = in.read()) != -1) {
                                                out.write(n);
                                        }
                                        // 释放资源
                                        in.close();
                                        out.close();
                                } catch (Exception e) {
                                        e.printStackTrace();
                                }
                        }
                }
        }


}
回复 使用道具 举报
想要那片海 发表于 2015-5-30 15:31
http://kisskingvv.blog.163.com/

总结的很不错哦,赞一个
回复 使用道具 举报
LSK~ 中级黑马 2015-6-4 13:30:00
9#
哇啊,你们的技术分都好高,怎么得的啊?马上要面试了还没分
回复 使用道具 举报
mnxnm 中级黑马 2015-5-30 15:41:22
8#
本帖最后由 mnxnm 于 2015-5-30 15:43 编辑
想要那片海 发表于 2015-5-30 15:31
http://kisskingvv.blog.163.com/

我也来注册个163,准备看资料写博客了
博客里的总结是你自己写的么
回复 使用道具 举报
mnxnm 发表于 2015-5-30 15:22
到哪一步了,面试了吗

http://kisskingvv.blog.163.com/
回复 使用道具 举报
mnxnm 发表于 2015-5-30 15:22
到哪一步了,面试了吗

已经提交预约了,还没确定时间

点评

你写的博客地址是多少,我去学习学习  发表于 2015-5-30 15:29
回复 使用道具 举报 1 0
想要那片海 发表于 2015-5-30 15:14
我在北京,在准备考北京的就业班,还没走完流程呢

到哪一步了,面试了吗
回复 使用道具 举报
mnxnm 发表于 2015-5-30 14:04
楼主,你在上海黑马班?

我在北京,在准备考北京的就业班,还没走完流程呢
回复 使用道具 举报
楼主,你在上海黑马班?
回复 使用道具 举报
/*第9题:编写程序,将指定目录下所有.java文件拷贝到另一个目的中,并将扩展名改为.txt

思路:
,
1、定义一个方法,获取指定目录下的所有.java文件,如果该目录下还有文件夹,则通过递归的方法遍历所有的.java文件,
并且将最终获取的.java型文件的文件名存储到集合中
2、定义一个copy的方法,方法中通过集合的迭代依取文件名逐一对文件进行复制,因为都是纯文本型的文件,
所以用到的流是Reader和Writer流,而为了进行高效的读取,则需要建立
BufferedReader和BufferedWriter对象


*/
import java.io.*;
import java.util.*;
class  Test9
{
        public static void main(String[] args)
        {
                File fromFile=new File("E:\\test9");//制定一个源路径
                File toFile=new File("E:\\testCopy9");//定义一个目的路径
                List<String> list = new ArrayList<String>();//定义一个数组,用来存储获取源路径中的.java文件名
                searchFile(fromFile,list);//在源路径下查找符合条件的文件名,存储到数组中;

                Iterator<String> it=list.iterator();//通过数组迭代器获取文件名,进行文件复制
                while(it.hasNext())
                {
                        String files=it.next();
                        System.out.println(files);
                        copyFile(files,toFile);
               
                }

        }
        //定义一个查找文件方法,接收一个源目录和一个List集合
       
        public static void searchFile(File fromFile,List<String> list)
        {
                 if(fromFile.exists() && fromFile.isDirectory())//判断源路径下是不是存在文件并且这是一个有效路径
                        {
                                File[] arr=fromFile.listFiles();//创建一个File型的数组,用来存储获取的文件列表
                                for(File files : arr)//使用高级for循环遍历数组
                                {
                                        if(files.isDirectory())
                                           searchFile(files,list);//如果获取到的文件还是一个目录则进行递归,进一步查找目录下的文件
                                        else if(files.getName().endsWith(".java"))
                                           list.add(files.getName());//如果是.java类型的文件则将文件名存储到数组中       
                                        else
                                                System.out.println("查找文件失败");
                                        System.out.println(list);
                                       
                                }
                         
                         }
                 else
                    System.out.println("源路径无效");
               

        }
        /**/

        //定义一个copy方法,接收一个源文件和一个目的文件
    public static void copyFile(String from,File to)
        {
                BufferedReader read=null;
                BufferedWriter write=null;
                try
                {
           //通过将File对象进行字节流转换为字符流,并且作为参数传入字符读取缓冲区中,进行高效读取
                        read=new BufferedReader(new FileReader(new File(from)));

                        //将后缀名替换为.txt的文件作为copy的目的地
                        write=new BufferedWriter(new FileWriter(new File(to,from.replace("\\.java$",".txt"))));
               
                    String line=null;
                        while((line=read.readLine())!=null)//判断:如果读取流没有读到文件的结尾
                        {
                                write.write(line);//将读取到的内容写入到缓冲流中
                                write.newLine();//换行
                                write.flush();//刷新
                        }
                       
                       
                }
                catch (IOException e)
                {
                        System.out.println("复制文件失败");
                }
                finally
                {
                  try
                  {
                        if(read!=null)//如果关联被读取的文件成功,则在执行完毕后关闭该读取流
                          read.close();   
                        if(write!=null)//如果写入流创建成功,则在执行完毕后关闭该写入流
                          write.close();  
                  }
                 catch (IOException e)
                        {
                                System.out.println("关闭流失败");
                        }
                }
       
       
        }
}
今早自己修改了一下copyFile方法的代码,昨天是由于在这个方法中给要读取的文件指定了目录,但是由于在指定目录下还有子目录,所以在copy过程中没有顺利的读取到子目录下的内容,因为在查找文件步骤已经将所有符合条件的文件名存储到List集合中,所以只需将List中的文件名作为new File()关联到读取流中即可,不需要限定读取流的目录。
目前属于初学阶段,发现问题和处理问题的敏感度还是不够好,希望以后与大家随时交流
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马