拷贝、移动文件(夹),有三方包commons-io可以用,但是有时候有自己的需求,只能使用原生java代码,这时可以用以下几种方式进行拷贝:

1、使用系统命令(Linux)调用

此种方式对操作系统有要求,好处是代码量少,性能可依赖操作系统优化,但是中间环节不可控。

  1. /**
  2. * 执行命令
  3. */
  4. private static void nativeCall(String... cmd) {
  5. ProcessBuilder pb = new ProcessBuilder(cmd);
  6. try {
  7. pb.redirectErrorStream(true);
  8. Process process = pb.start();
  9. InputStream stream = process.getInputStream();
  10. byte[] buff = new byte[4096];
  11. while (stream.read(buff, 0, 4096) != -1) {}
  12. stream.close();
  13. } catch (IOException e) {
  14. e.printStackTrace();
  15. }
  16. }
  17.  
  18. // 使用CMD拷贝目录
  19. public static void cmdCopyDir(File src, File des) {
  20. if (!des.exists()) {
  21. des.mkdirs();
  22. }
  23. String[] cmds = new String[] { "sh", "-c", "cp -a \"" + src.getAbsolutePath() + "/.\" \"" + des.getAbsolutePath() + "\"" };
  24. Executor.nativeCall(cmds);
  25. }
  26.  
  27. // 使用CMD删除目录
  28. public static void cmdDelDir(File dic) {
  29. if (dic.exists() && dic.isDirectory()) { // 判断是文件还是目录
  30. String[] cmds = new String[] { "sh", "-c", "rm -rf \"" + dic.getAbsolutePath() + "\"" };
  31. Executor.nativeCall(cmds);
  32. }
  33. }

2、使用文件通道拷贝

此种方式是常用的拷贝方式,大部分环节、异常都是可控的,具体的文件复制则使用了通道的方式进行加速。

  1. // 拷贝目录
  2. public static void javaCopyDir(File src, File des) throws IOException {
  3. if (!des.exists()) {
  4. des.mkdirs();
  5. }
  6. File[] file = src.listFiles();
  7. for (int i = 0; i < file.length; ++i) {
  8. if (file[i].isFile()) {
  9. channelCopy(file[i], new File(des.getPath() + "/" + file[i].getName()));
  10. } else if (file[i].isDirectory()) {
  11. javaCopyDir(file[i], new File(des.getPath() + "/" + file[i].getName()), stoppable);
  12. }
  13. }
  14. }
  15.  
  16. // 拷贝文件
  17. private static void channelCopy(File src, File des) throws IOException {
  18. FileInputStream fi = null;
  19. FileOutputStream fo = null;
  20. FileChannel in = null;
  21. FileChannel out = null;
  22. IOException ex = null;
  23. try {
  24. fi = new FileInputStream(src);
  25. fo = new FileOutputStream(des);
  26. in = fi.getChannel();
  27. out = fo.getChannel();
  28. in.transferTo(0, in.size(), out); // 连接两个通道,并且从in通道读取,然后写入out通道
  29. } finally {
  30. try {
  31. fi.close();
  32. in.close();
  33. } catch (IOException e) {
  34. ex = e;
  35. }
  36. try {
  37. fo.close();
  38. out.close();
  39. } catch (IOException e) {
  40. ex = e;
  41. }
  42. }
  43. if (ex != null) {
  44. throw ex;
  45. }
  46. }

3、原生删除目录

  1. // 删除目录
  2. private static void javaDelDir(File dic) throws IOException {
  3. if (dic.exists() && dic.isDirectory()) {
  4. File delFile[] = dic.listFiles();
  5. if (delFile.length == 0) { // 若目录下没有文件则直接删除
  6. dic.delete();
  7. } else {
  8. for (File file : delFile) {
  9. if (file.isDirectory()) {
  10. javaDelDir(file); // 递归调用del方法并取得子目录路径
  11. }
  12. file.delete(); // 删除文件
  13. }
  14. dic.delete();
  15. }
  16. }
  17. }

转载请注明原址:http://www.cnblogs.com/lekko/p/8472353.html

原生Java代码拷贝目录的更多相关文章

  1. java代码实现目录结构

    今天用java代码来实现.像我们电脑盘符那样的目录结构.在代码开始之前首先.介绍一下.用.java代码实现目录的思想. 第一步:完成基础的.大家想.我们是如何获取文件的.是不是用File类,直接就获取 ...

  2. 不使用spring的情况下原生java代码两种方式操作mongodb数据库

    由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常.   主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...

  3. JAVA WEB项目目录结构以及web应用部署的根目录,编译路径和项目根目录的区别

    本文链接:https://blog.csdn.net/l00149133/article/details/78984083 web应用部署的根目录,编译路径和项目的根目录有什么区别? 直接上例子: 你 ...

  4. java压缩指定目录下的所有文件和文件夹的代码

    将代码过程较好的代码段备份一下,下边资料是关于java压缩指定目录下的所有文件和文件夹的代码,希望对码农有帮助. String sourceDir="E:\test";int pa ...

  5. 原生java调用webservice的方法,不用生成客户端代码

    原生java调用webservice的方法,不用生成客户端代码 2015年10月29日 16:46:59 阅读数:1455 <span style="font-family: Aria ...

  6. 用java代码实现构造目录树

    怎么用java代码实现上面这样的目录树? 首先创建数据表 每条数据记录自己的id以及父节点的id 然后进入java代码部分: public String directory(String author ...

  7. IDEA的小技巧:1.Java代码不被识别2.目录下创建的文件夹所显示样式不是文件夹,而是"包"图标样式的问题

    在Idea上面一个正常的代码结构是这个样子的,但是有的时候,比如说当我们直接在一个文件夹中随便的创建的时候就会出现一些问题,比如说想让某个地方为代码目录,某个地方为资源目录的时候,直接的创建目录是不成 ...

  8. java代码打包成jar以及转换为exe

    教你如何把java代码打包成jar文件以及转换为exe可执行文件 1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有 ...

  9. 转!!Java代码规范、格式化和checkstyle检查配置文档

    为便于规范各位开发人员代码.提高代码质量,研发中心需要启动代码评审机制.为了加快代码评审的速度,减少不必要的时间,可以加入一些代码评审的静态检查工具,另外需要为研发中心配置统一的编码模板和代码格式化模 ...

随机推荐

  1. asp.net -mvc框架复习(11)-基于三层架构与MVC实现完整的用户登录

    一.先从M部分写起(Modles\DAL\BLL) 1.Modles 实体类:上次实体类已经搞定. 2.DAL 数据访问类类 (1)通用数据数据访问类: A:  先编写数据连接字符串,写到网站根目录W ...

  2. Apache Commons介绍(转载)

    一.Commons BeanUtils说明:针对Bean的一个工具集.由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装. 二.Commons CLI说明:这 ...

  3. 开地址哈希表(Hash Table)的接口定义与实现分析

    开地址哈希函数的接口定义 基本的操作包括:初始化开地址哈希表.销毁开地址哈希表.插入元素.删除元素.查找元素.获取元素个数. 各种操作的定义如下: ohtbl_init int ohtbl_init ...

  4. mybatis一级缓存二级缓存

    一级缓存 Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言.所以在参数和SQL完全一样的情况下,我们使用同一个SqlSess ...

  5. 第一个简单的maven项目

    学习一个新的东西,最快的方式就是实践.所以我们也不用多说什么了,直接拿一个项目来练手.下面的整理取自maven权威指南,在一堆maven资料中,我觉得这本书写的最好. 简介 我们介绍一个用Maven ...

  6. eclipse中注释的代码依然会执行的解决方法

    问题: eclipse中注释的代码在debug的时候居然还能执行.那一刻内心是崩溃的.. 解决方案: 项目重编译显示都正常,并没有报错,然后发现项目编译后,WEB-INF/lib/classes中的c ...

  7. 前端自动化测试神器-Katalon的基础用法

    前言 最近由于在工作中需要通过Web端的功能进行一次大批量的操作,数据量大概在5000左右,如果手动处理, 完成一条数据的操作用时在20秒左右的话,大概需要4-5个人/天的工作量(假设一天8小时的工作 ...

  8. awk批量处理文件夹中所有文件

       #c=``     done

  9. JS-使用工厂方法创建对象

    function createPerson(name,age,gender){ //创建新对象 var obj=new Object(); //向对象中添加属性 obj.name=name; obj. ...

  10. ios中pch文件的创建与配置

     PCH文件(Precompile Prefix Header File),也就是预编译头文件,其作用就是,方便你一次性导入在多个文件中同时用到的头文件.宏或者URL地址等(全局使用),可以有效的帮你 ...