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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

[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;
			}
		}
	}

}
回复 使用道具 举报
学习学习!
回复 使用道具 举报
是的,要遍历所有子文件夹嘛
回复 使用道具 举报
[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 很给力!

查看全部评分

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

少创建一个文件夹吧
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马