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

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

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

     /**
* 执行命令
*/
private static void nativeCall(String... cmd) {
ProcessBuilder pb = new ProcessBuilder(cmd);
try {
pb.redirectErrorStream(true);
Process process = pb.start();
InputStream stream = process.getInputStream();
byte[] buff = new byte[4096];
while (stream.read(buff, 0, 4096) != -1) {}
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
} // 使用CMD拷贝目录
public static void cmdCopyDir(File src, File des) {
if (!des.exists()) {
des.mkdirs();
}
String[] cmds = new String[] { "sh", "-c", "cp -a \"" + src.getAbsolutePath() + "/.\" \"" + des.getAbsolutePath() + "\"" };
Executor.nativeCall(cmds);
} // 使用CMD删除目录
public static void cmdDelDir(File dic) {
if (dic.exists() && dic.isDirectory()) { // 判断是文件还是目录
String[] cmds = new String[] { "sh", "-c", "rm -rf \"" + dic.getAbsolutePath() + "\"" };
Executor.nativeCall(cmds);
}
}

2、使用文件通道拷贝

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

     // 拷贝目录
public static void javaCopyDir(File src, File des) throws IOException {
if (!des.exists()) {
des.mkdirs();
}
File[] file = src.listFiles();
for (int i = 0; i < file.length; ++i) {
if (file[i].isFile()) {
channelCopy(file[i], new File(des.getPath() + "/" + file[i].getName()));
} else if (file[i].isDirectory()) {
javaCopyDir(file[i], new File(des.getPath() + "/" + file[i].getName()), stoppable);
}
}
} // 拷贝文件
private static void channelCopy(File src, File des) throws IOException {
FileInputStream fi = null;
FileOutputStream fo = null;
FileChannel in = null;
FileChannel out = null;
IOException ex = null;
try {
fi = new FileInputStream(src);
fo = new FileOutputStream(des);
in = fi.getChannel();
out = fo.getChannel();
in.transferTo(0, in.size(), out); // 连接两个通道,并且从in通道读取,然后写入out通道
} finally {
try {
fi.close();
in.close();
} catch (IOException e) {
ex = e;
}
try {
fo.close();
out.close();
} catch (IOException e) {
ex = e;
}
}
if (ex != null) {
throw ex;
}
}

3、原生删除目录

     // 删除目录
private static void javaDelDir(File dic) throws IOException {
if (dic.exists() && dic.isDirectory()) {
File delFile[] = dic.listFiles();
if (delFile.length == 0) { // 若目录下没有文件则直接删除
dic.delete();
} else {
for (File file : delFile) {
if (file.isDirectory()) {
javaDelDir(file); // 递归调用del方法并取得子目录路径
}
file.delete(); // 删除文件
}
dic.delete();
}
}
}

转载请注明原址: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. 7系列高速收发器总结 GTP IP核使用篇

    上一篇7系列收发器博文讲解了GTP IP核的基本配置,本文继续分析如何将它使用起来.生成IP核后打开example design,先看看工程中包含的文件结构. 顶层文件下包含了gtp ip核系统顶层文 ...

  2. Web API (四) 特性路由(Attribute Route)

    特性路由 是Web API 2 中提出的一种新的类型的路由,正如其名称那样,它是通过特性(Attribute) 来定义路由的,相比之前的基于模式(Convertion Based)的路由,特性路由 能 ...

  3. ios MVVM实践 刷新网络请求+tableView展示数据

    [实现效果] [目录结构相关] 此示例展示用的是MVVM结构形式,表述如下 M:数据Model的存储,可以用来对属性进行处理.(即胖model概念,上图中xx万人订阅这个处理方法写在Model内) V ...

  4. z-index在IE中的坑

    在CSS2.1规范中,每个盒模型的位置是三维的,分别是平面画布上的x轴,y轴以及表示层叠的z轴.对于每个html元素,都可以通过设置z-index属性来设置该元素在视觉渲染模型中的层叠顺序. z-in ...

  5. 常用API

    1 System类 System类包含一些有用的类和字段.它不能被实例化. 属性和方法都是静态的. 1.1 常见方法 返回以毫秒为单位的当前时间 public static long currentT ...

  6. linux(ubuntu或Deepin等)+win7双系统升级win10出现grub解决办法

    1,set root=(hd0,msdos11) 2,set prefix=(hd0,msdos11)/boot/grub 3,insmod /boot/grub/i386-pc/normal.mod ...

  7. C# 类型基础(上)

    C#类型都派生自System.Object 祖先的优良传统:Object的公共方法 Equals: 对象的同一性而非相等性 GetHashCode:返回对象的值的哈希码 ToString:默认返回类型 ...

  8. 用户 'IIS APPPOOL\.NET v4.5 Classic' 登录失败。

    我在win8.1系统下用vs2013+SqlServer08编写完项目后,挪到另一台win8.1系统(安装了Vs2010+SqlServer08)中,把网址挂到IIs中时,出现如下错误 : 解决方案: ...

  9. 节点操作,节点属性的操作及DOM event事件

    ##1. 节点操作 createElement(标签名) 创建一个指定名称的元素 someone.appendChild(new_node) 追加一个子节点(作为最后的子节点) someone.ins ...

  10. 【AIX】AIX内存机制

    [AIX]AIX内存机制 1  虚拟内存 虚拟内存是物理内存和交换空间(Paging Space)组合形成的虚拟内存空间, 通过虚拟的地址空间映射到物理内存或者 Paging Space. 在 AIX ...