从控制台获取输入的文件目录然后将该目录(包含子目录)下的.java文件复制到D:/java文件夹中

   6.从控制台获取输入的文件目录然后将该目录(包含子目录)下的.java文件复制到D:/java文件夹中
   
   解题思路:
    1,控制台输入两个文件路径
    2,将路径下的文件遍历,碰到 .java 文件 就调用 复制函数,将相关的.java复制过去 
    3, 复制文件函数 CopyFile

参考文章如下:

Java基础阶段综合练习      https://www.cnblogs.com/hd976521/archive/2017/02/10/6387514.html

参考代码:

package com.模拟练习题四;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

/** 
 *2.从控制台获取输入的文件目录然后将指定目录下的.java文件复制到D:/java文件夹中
 * @author Administrator
 */
public class Demo02 {
    public static void main(String[] args) throws IOException {
        File file = getFile();
        File dest = new File("D:\\java");
        if(!dest.exists()){
            dest.mkdirs();
        }
        copy(file,dest);
    }

    private static void copy(File file, File dest) throws IOException {
        // TODO Auto-generated method stub
        File[] files = file.listFiles();
        if(files!=null){
            for (File file2 : files) {
                //判断是否是文件   在判断段结尾是否是.java
                if(file2.isFile() && file2.getName().toLowerCase().endsWith(".java")){
                    BufferedInputStream br = new BufferedInputStream(new FileInputStream(file2));
                    BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream(new File(dest,file2.getName())));
                    byte[] by = new byte[1024];
                    int len = 0;
                    while((len=br.read())!=-1){
                        bw.write(by, 0, len);
                    }
                    br.close();
                    bw.close();
                }else if(file2.isDirectory()){
                    copy(file2, dest);
                }
            }
        }
    }

    private static File getFile() {
        // TODO Auto-generated method stub
        System.out.println("请输入一个文件夹路径");
        Scanner sc = new Scanner(System.in);
        String str =sc.nextLine();
        File file = new File(str);
        while(true){        
            if(!file.exists()){
                System.out.println("你输入的文件夹路径不存在,请重新输入");
            }else if(file.isFile()){
                System.out.println("你输入的是文件路径,请重新输入");
            }else{            
                return file;
            }
        }
    }
}
下面是我写的代码,为了跟前面的文件过滤器FileFilter 连接上,所以我选择了用过滤器来筛选 .java文件

class MyFileFilter 的代码:

package HomeWork6;

import java.io.File;
import java.io.FileFilter;

public class MyFileFilter implements FileFilter{

	/*public boolean accept(File pathname) {
		return false;
	}*/
	//如果是文件夹或者是以 “.java”结尾的,就返回 true,否则返回 false
	public boolean accept(File file){
		if(file.isDirectory()){
			return true;
		}else {
				String name = file.getName();
				if(name.endsWith(".java")){
				return true;
			}else {
				return false;
			}
		}
	}
	
}
将文件复制过去的代码如下:


/*
   6.从控制台获取输入的文件目录然后将该目录(包含子目录)下的.java文件复制到D:/java文件夹中
   
   解题思路:
    1,控制台输入两个文件路径
    2,将路径下的文件遍历,碰到 .java 文件 就调用 复制函数,将相关的.java复制过去 
    3, 复制文件函数 CopyFile
*/
package HomeWork6;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class CopyFile_ToJava {
	public static void main(String[] args)  {
		String path = inputFilePath();
		getJavaFile(path);	
	}
	
	//复制文件函数
		public static void copyFile(File file){
			FileReader fr = null;
			FileWriter fw = null;
			try{
				fr = new FileReader(file.getPath());
				fw = new FileWriter("h:\\java\\"+file.getName());
				char[] ch = new char[1024]; //设立缓冲数组
				int len = 0; //读取字符的个数
				while((len = fr.read(ch)) != -1){
					fw.write(ch,0,len);
				}
			}catch(IOException ex){
				System.out.println(ex);
				throw new RuntimeException("文件复制失败!");
			}finally{
				try{
					if(fw != null)
						fw.close();
				}catch(IOException ex){
					System.out.println(ex);
					throw new RuntimeException("fw释放资源失败!");
				}finally{
					try{
						if(fr != null)
							fr.close();
					}catch(IOException ex){
						ex.printStackTrace();
						throw new RuntimeException("fr释放资源失败!");
					}
				}
			}
		}
		

	/*
	 *   方法三:    将路径下的所有  .java 文件全部选出,并存储到 list 列表中
	 */ 
	public static void getJavaFile(String path){
		File file = new File(path);
		File[] files = file.listFiles(new MyFileFilter());//将java文件过滤出来
		for(int i = 0; i < files.length; i++){
			if(files[i].isDirectory()){
				getJavaFile(files[i].getPath());
			}else{
				copyFile(files[i]);
			}
		}
	}
	
	
	/*
	 *   控制台输入一个文件夹路径
	 */
	public static String inputFilePath(){
		System.out.println("请输入要复制 .java文件 的文件夹路径:(例如:g:\\eclipse\\workspace)");
		Scanner sc = new Scanner(System.in);
		String path = sc.nextLine();
		sc.close();
		return path;
	}	
}


另外,复制函数,我写了有几个,供大家参考一下(当然,也为了我以后参考\(^o^)/~):

函数一:

//复制所有文件方法二
       /*	
	*   不用文件过滤器,将所有 .java 文件全部选出来,存储到 D:\\java文件中
	*/
	public static void getJavaToList_2(String path) throws IOException{
		File file = new File(path);
		File[] files = file.listFiles();
		for (int i = 0; i < files.length; i++) {
			if(files[i].isDirectory()){
				getJavaToList_2(files[i].getPath());
			}else {
				if(files[i].getName().endsWith(".java")){
					copyFile(files[i]);
				}
			}
		}
	}
	
函数二:

//复制所有文件方法一
//这个方法也可以,不过我总感觉有点不安全的感觉
  public static void getJavaToList_1(String path) throws IOException{
		File file = new File(path);
		File[] files = file.listFiles();
		for (int i = 0; i < files.length; i++) {
			if(files[i].isDirectory()){
				getJavaToList_1(files[i].getPath());
			}else {
				if(files[i].getName().endsWith(".java")){
					//创建读写对象,将相应的文件复制过来
					FileReader fr = new FileReader(files[i].getPath());
					FileWriter fw = new FileWriter("h:\\java\\"+files[i].getName());
					char[] ch = new char[1024];//设置字符缓冲数组
					int len = 0;  //读取字符的个数
					//读取文件,写入文件
					while((len = fr.read(ch)) != -1){
						fw.write(ch,0,len);
					}
					fw.close();
					fr.close();
					
				}
			}
		}
	}

以上代码,大家在参考的时候可以有自己的思考,代码只供参考,要有自己的思路在里面。



你可能感兴趣的:(JavaSE学习)