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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hysnxdss 中级黑马   /  2016-9-26 21:13  /  1874 人查看  /  25 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

编写一个程序,把指定目录下的所有的带.java文件都拷贝到另一个目录中,
拷贝成功后,把后缀名是.java的改成.txt

25 个回复

正序浏览
Fate_stay 发表于 2016-9-27 17:18
我前几天刚做过这道题,关键是: 先复制, 后改名
import java.io.BufferedReader;
import java.io.BufferedWr ...

少创建一个文件夹吧
回复 使用道具 举报
就是要递归!
回复 使用道具 举报
[Java] 纯文本查看 复制代码
	public static void main(String[] args) throws IOException {
		File dir = getDir();//键盘录入文件夹
		File dest = new File("D:\\day");//默认目的地文件夹
		dest.mkdirs();
		resetTo(dest,dir);//递归调用
	}

	private static void resetTo(File dest, File dir) throws IOException {
		File[] subfiles = dir.listFiles();
		if(subfiles == null){//排除拒绝访问的文件以免出错
			return;
		}
		for (File f : subfiles) {
			String name = f.getName();
			if(f.isFile() && name.endsWith(".java")){//寻找".java"结尾的文件
				File d = new File(dest,name.replace(".java", ".txt"));//用目的地文件夹和改后的文件名创建新文件
				FileReader fr = new FileReader(f);
				FileWriter fw = new FileWriter(d);
				int len;
				char[] chs = new char[1024];
				while((len = fr.read(chs)) != -1){//将文件上的数据读取到字符数组中
					fw.write(chs, 0, len);		//将字符数组中的数据写到文件上
				}
				fr.close();
				fw.close();
			}else if(f.isDirectory()){//若是文件夹就递归,其他情况继续进入下一循环
				resetTo(dest,f);
			}
		}
	}

	private static File getDir() {
		Scanner sc = new Scanner(System.in);
		while(true){
			String line = sc.nextLine();
			File dir = new File(line);
			if(!dir.exists()){
				System.out.println("格式错,文件不存在");
			}else if(dir.isFile()){
				System.out.println("这是文件夹,请重录");
			}else{
				return dir;
			}
		}
	}

评分

参与人数 1黑马币 +5 收起 理由
荔荔舟 + 5 很给力!

查看全部评分

回复 使用道具 举报
是的,要遍历所有子文件夹嘛
回复 使用道具 举报
学习学习!
回复 使用道具 举报
[Java] 纯文本查看 复制代码
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Scanner;

public class Demo2 {

	private static Scanner sc = new Scanner(System.in);
	private static File copy;

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		/*
		 * 4、编写一个程序,把指定目录下的所有的带.java文件都拷贝到另一个目录中,拷贝成功后,把后缀名是.java的改成.txt。
		 * 
		 * 解题思路: 1.使用键盘录入接收一个文件夹路径, 输入正确则返回一个文件夹路径, 不正确则提示并 死循环接收.
		 * 
		 * 2.再让其输入一个存放路径,跟第1步相同 3.再使用递归方法查询指定目录下的文件,如果是文件夹,就递归调用 4.如果是文件,就判断
		 * 如果是.java文件,如果是.java文件则使用拷贝, 使用高效的字节读取流将文件读取, 再使用高效的字节输出流将文件名修改并复制
		 * 
		 * 其他的文件就不搭理
		 */

		System.out.println("请输入要被拷贝的文件夹路径:");
		File f = getPath();
		System.out.println("请输入要复制到指定的文件夹路径:");
		copy = getPath();

		digui(f);

	}

	private static void digui(File f) {
		/**
		 * * 3.再使用递归方法查询指定目录下的文件,如果是文件夹,就递归调用 4.如果是文件,就判断
		 * 如果是.java文件,如果是.java文件则使用拷贝, 使用高效的字节读取流将文件读取, 再使用高效的字节输出流将文件名修改并复制
		 * 
		 * 其他的文件就不搭理
		 */
		File[] listFiles = f.listFiles();
		for (File file : listFiles) {
			if (file.isDirectory()) {
				digui(file);// 如果是文件夹,则递归调用
			} else {
				/**
				 * 4.如果是文件,就判断 如果是.java文件,如果是.java文件则使用拷贝, 使用高效的字节读取流将文件读取,
				 * 再使用高效的字节输出流将文件名修改并复制
				 */
				if(file.getName().endsWith(".java")){
					System.out.println(file.getName());
					try {
						BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
						File name = new File(copy,file.getName().replace(".java", ".txt"));
						BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(name));
						
						int b;
						while((b = bis.read()) != -1){
							bos.write(b);
						}
						bis.close();
						bos.close();
						
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
	}

	private static File getPath() {

		while (true) {
			// 如果不是正确的路径,则提示请输入正确的路径
			File file = new File(sc.nextLine());
			if (!file.exists()) {
				System.out.println("请输入正确的路径");
			} else if (file.isFile()) {
				System.out.println("你输入的是文件路径,请输入文件夹路径");
			} else {
				return file;
			}
		}
	}

}
回复 使用道具 举报
基础班23天的例题改一下,应该是Test3的代码
回复 使用道具 举报
CreScert 来自手机 中级黑马 2016-10-1 00:23:51
19#
要用递归,比较方便点,还是推荐递归吧
回复 使用道具 举报
package cn.itcast.demo5;  import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileFilter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; public class Work4 {          /*          * 将用户输入在控制台上的指定路径下所有的.txt 文件复制到 c盘下随意目录          * (你可以自 己指定路径)并在复制后将.txt 后缀名更改成.java后缀名           */         public static void copyFile(File file,File newFile) throws IOException{                 //定义一个字符缓冲区输入流                 BufferedReader br=new BufferedReader(new FileReader(file));                 //定义一个字符缓冲区输出流                 BufferedWriter bw=new BufferedWriter(new FileWriter(newFile));                 String line=null;                 while((line=br.readLine())!=null){                         bw.write(line);                         bw.newLine();                         bw.flush();                 }                 br.close();                 bw.close();                                           }         public static void main(String[] args) throws IOException {                         //封装目录                 File resFile=new File("F:\\新建文件夹 (2)\\txt");                 File desFile=new File("F:\\新建文件夹 (2)\\demo");                 //如果desFile不存在创建一个                 if(!desFile.exists()){                         desFile.mkdir();                 }                 File[] fileArray=resFile.listFiles(new FileFilter() {                         @Override                         public boolean accept(File f) {                                 if(f.isFile()){                                         if(f.getName().endsWith(".txt")){                                                 return true;                                         }                                 }                                 return false;                         }                 });                 for (File file : fileArray) {                         File newFile=new File(desFile,file.getName());                         copyFile(file,newFile);                 }                 //在目的下改名                 File[] files=desFile.listFiles();                 for (File file : files) {                         File newFile=new File(desFile,file.getName().replace(".txt", ".java"));                         file.renameTo(newFile);                 }                          } }
回复 使用道具 举报
package cn.itcast.demo5;  import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileFilter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; public class Work4 {          /*          * 将用户输入在控制台上的指定路径下所有的.txt 文件复制到 c盘下随意目录          * (你可以自 己指定路径)并在复制后将.txt 后缀名更改成.java后缀名           */         public static void copyFile(File file,File newFile) throws IOException{                 //定义一个字符缓冲区输入流                 BufferedReader br=new BufferedReader(new FileReader(file));                 //定义一个字符缓冲区输出流                 BufferedWriter bw=new BufferedWriter(new FileWriter(newFile));                 String line=null;                 while((line=br.readLine())!=null){                         bw.write(line);                         bw.newLine();                         bw.flush();                 }                 br.close();                 bw.close();                                           }         public static void main(String[] args) throws IOException {                         //封装目录                 File resFile=new File("F:\\新建文件夹 (2)\\txt");                 File desFile=new File("F:\\新建文件夹 (2)\\demo");                 //如果desFile不存在创建一个                 if(!desFile.exists()){                         desFile.mkdir();                 }                 File[] fileArray=resFile.listFiles(new FileFilter() {                         @Override                         public boolean accept(File f) {                                 if(f.isFile()){                                         if(f.getName().endsWith(".txt")){                                                 return true;                                         }                                 }                                 return false;                         }                 });                 for (File file : fileArray) {                         File newFile=new File(desFile,file.getName());                         copyFile(file,newFile);                 }                 //在目的下改名                 File[] files=desFile.listFiles();                 for (File file : files) {                         File newFile=new File(desFile,file.getName().replace(".txt", ".java"));                         file.renameTo(newFile);                 }                          } }
回复 使用道具 举报
还没学到呢,看看不说话,不过感觉好难的样子
回复 使用道具 举报
郑大仙丶 发表于 2016-9-27 22:19
同学吧..........和我作业一模一样...

这道题.

javase  双元 2期   复制一个多级文件夹,
该怎么做呢?
回复 使用道具 举报
babysa 发表于 2016-9-28 22:43
没有大神  javase  双元

我也是  javase  双元  2
回复 使用道具 举报
Fate_stay 发表于 2016-9-27 17:18
我前几天刚做过这道题,关键是: 先复制, 后改名
import java.io.BufferedReader;
import java.io.BufferedWr ...

可以,可以,很强,比我写的好多啦,受教啦
回复 使用道具 举报
以为目前学到的知识来说,是需要用递归的
回复 使用道具 举报
[Java] 纯文本查看 复制代码
public class Test {

	/**
	 * 
	 * @author ZhangYiLing
	 * 
	 */
	public static void main(String[] args) throws IOException {
		//源文件目录
		File srcName = new File("D:\\文档");
		//目标文件目录
		File destName = new File("E:\\test4");
		//判断目的地文件夹是否存在,如不存在则创建它
		if (!destName.exists()) {
			destName.mkdir();
		}
		
		//调用文件夹复制功能
		copyFolder(srcName,destName);
	}

	private static void copyFolder(File srcName, File destName) throws IOException {
		//判断srcName对象是否为文件夹,如果不是则复制里面的所有文件.
		if (srcName.isDirectory()) {
			//建立目的地文件夹路径
			File newFolder = new File(destName,srcName.getName());
			//创建目的地文件夹
			newFolder.mkdir();
			//获取源地址文件夹数组
			File [] folderArray = srcName.listFiles();
			//使用增强for循环获取源地址每一个文件夹
			for(File file: folderArray) {
				//使用递归,继续获取源地址文件夹路径名称后创建到目的地路径文件夹
				copyFolder(file,newFolder);
			}
			
		// 过滤非java文件
		} else if (srcName.isFile() && srcName.getName().endsWith(".java")){
			// 将java文件的后缀名替换为txt
			String destTxt = srcName.getName().replace(".java", ".txt");
			//创建一个新的文件对象用于指定输出文件路径
			File newFile = new File(destName,destTxt);
			copyFile(srcName,newFile);
		}
	}

	private static void copyFile(File srcName, File newFile) throws IOException {
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcName));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile));
		
		byte [] bys = new byte[1024];
		int len = 0;
		while((len = bis.read(bys)) != -1){
			bos.write(bys,0,len);
		}
		
		bos.close();
		bis.close();
	}
}
回复 使用道具 举报

没有大神  javase  双元
回复 使用道具 举报
同学吧..........和我作业一模一样...

这道题.
要用递归,最主要的是要创建文件夹.
回复 使用道具 举报
其实用Files类的话要比旧的File类迭代目录要容易一些,Files类设计了可以把目录生成一个Iterable迭代器对象,还可以用glob模式过滤文件,glob的模式和windows的通配符很相似,像要找以java结尾的文件用*.java就可以了非常方便
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马