本帖最后由 tsldxszd 于 2016-1-12 03:03 编辑
- import java.io.*;
- import java.nio.channels.FileChannel;
- import java.util.HashMap;
- import java.util.Map.Entry;
- import java.util.Scanner;
- /**
- * 复制 D:中所有的.java 文件并改其后缀名为.txt 黏贴到 桌面上,当然可以是任何地方,
- * 、只是我懒得做这无聊 的事了。
- *
- * 这个代码实现了以下功能,
- * 1:不是指定某个文件夹 ,其范围可以大到搜索整个C或D或E盘里的 所有.java文件,
- * 2:而不是单纯的复制黏贴 某一个 .java文件。不限制拷贝的文件个数,测试中 拷贝
- * 了27个 D盘某 文件 夹中的.java文件,
- * 3:用FileChannel 传输 ,大大 提高 了传输 速度。27个文件秒速到桌面
- * 4:使用map集合只用2个函数就完成了所有的基本功能
- *
- * 收获:1:学习了map的遍历,因为 习惯了foreach,所以很不适应 map
- * 2:学到了FileChannel ,效率提升太明显了。
- * 3:加强了对 IO 流的理解和学习,尤其是File类的提高,改名字这里卡了二个小时,拷贝到指定文件夹卡 了3个小时。。
- * 4:再次复习了进入文件夹的代码。
- *
- *
- * @author 姜淑一
- *
- */
- public class TestCopy2
- {
- public static void main(String[] args) throws IOException
- {
- // 让用户自己输入需要拷贝的文件夹
- String s = forName();
- File file = new File(s);
- // 为了省代码,我定义在main里输入输出流
- FileInputStream in = null;
- FileOutputStream out = null;
- // 这里必须用map集合,一个装file.getPath,一个装file.getName,因为只有map集合 才能存放两个String参数
- // 这是 为了改变.java成.txt的必要条件,也是输入输出流不给力的地方
- HashMap <String,String>map = new HashMap<String, String>();
- // getfile方法是为了取出例如在D:盘中 所有 .java文件的绝对路径key和文件名value,存放 到map集合,为 copy方法做准备
- // 里面还用递归的方法实现了排除文件夹找文件的方法
- getFile(file ,map);
- // 找到需要的所有.java文件后,通过对 map的遍历,一一对应的把key(绝对路径)传给Input,
- // 把修改后的value(文件名)传给output,由于效率上考虑,在这里选择了
- // java.nio.channels.FileChannel;用File对象.getChannel()获得传输通道
- copy(in,out,map);
- System.out.println("已经帮你把"+s+"中的所有.java文件改为.txt文件并拷贝到了桌面上");
- }
- public static String forName()
- {
- Scanner sc = new Scanner(System.in);
- System.out.println("请输入您想复制的文件夹(格式如D:\\\\或者D:\\\\xxx\\\\)");
- System.out.println("请注意,如果您输入的是c:\\或者D:\\,查找会比较慢");
- String line = sc.nextLine();
- sc.close();
- return line;
- }
- public static void copy (FileInputStream in,FileOutputStream out,HashMap<String,String>map)
- throws IOException
- {
- FileChannel o = null;
- FileChannel i = null;
- // 这个遍历的方法是利用entry来做的
- for (Entry<String, String> entry : map.entrySet())
- {
- // 定义输入输出 流,输入流就是.java的路径,输出 流就是通过文件名修改过后的.txt的路径
- in = new FileInputStream(entry.getKey());
- out = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\"
- +entry.getValue().replace(".java", ".txt"));
- // 获得out通道和in通道,对接传输
- o = out.getChannel();
- i= in.getChannel();
- i.transferTo(0, i.size(), o);
- }
- }
- public static void getFile(File file,HashMap<String,String>map)
- {
- // 递归去掉文件夹
- File[] list = file.listFiles();
- // 递归和for循环 的联用,递归判断listp是否 文件夹,是文件夹,就继续进入。
- // for循环控制文件比较的 次数,也就是给map赋值
- if(list !=null)
- {
- for (int i = 0; i < list.length; i++)
- {
- if (list.isDirectory())
- {
- getFile(list,map);
- }
- // 只有结尾为.txt的文件 才添加路径和文件名到map集合中
- else
- {
- if(list.getName().endsWith(".java"))
- {
- String key =list.getPath();
- String value = list.getName();
- map.put(key,value);
- }
- }
- }
- }
- }
- }
|