原生Java代码拷贝目录
拷贝、移动文件(夹),有三方包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代码拷贝目录的更多相关文章
- java代码实现目录结构
今天用java代码来实现.像我们电脑盘符那样的目录结构.在代码开始之前首先.介绍一下.用.java代码实现目录的思想. 第一步:完成基础的.大家想.我们是如何获取文件的.是不是用File类,直接就获取 ...
- 不使用spring的情况下原生java代码两种方式操作mongodb数据库
由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常. 主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...
- JAVA WEB项目目录结构以及web应用部署的根目录,编译路径和项目根目录的区别
本文链接:https://blog.csdn.net/l00149133/article/details/78984083 web应用部署的根目录,编译路径和项目的根目录有什么区别? 直接上例子: 你 ...
- java压缩指定目录下的所有文件和文件夹的代码
将代码过程较好的代码段备份一下,下边资料是关于java压缩指定目录下的所有文件和文件夹的代码,希望对码农有帮助. String sourceDir="E:\test";int pa ...
- 原生java调用webservice的方法,不用生成客户端代码
原生java调用webservice的方法,不用生成客户端代码 2015年10月29日 16:46:59 阅读数:1455 <span style="font-family: Aria ...
- 用java代码实现构造目录树
怎么用java代码实现上面这样的目录树? 首先创建数据表 每条数据记录自己的id以及父节点的id 然后进入java代码部分: public String directory(String author ...
- IDEA的小技巧:1.Java代码不被识别2.目录下创建的文件夹所显示样式不是文件夹,而是"包"图标样式的问题
在Idea上面一个正常的代码结构是这个样子的,但是有的时候,比如说当我们直接在一个文件夹中随便的创建的时候就会出现一些问题,比如说想让某个地方为代码目录,某个地方为资源目录的时候,直接的创建目录是不成 ...
- java代码打包成jar以及转换为exe
教你如何把java代码打包成jar文件以及转换为exe可执行文件 1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有 ...
- 转!!Java代码规范、格式化和checkstyle检查配置文档
为便于规范各位开发人员代码.提高代码质量,研发中心需要启动代码评审机制.为了加快代码评审的速度,减少不必要的时间,可以加入一些代码评审的静态检查工具,另外需要为研发中心配置统一的编码模板和代码格式化模 ...
随机推荐
- 阿里巴巴Java开发手册评
2016年底的时候阿里巴巴公开了其在内部使用的Java编程规范.随后进行了几次版本修订,目前的版本为v1.0.2版.下载地址可以在其官方社区-云栖社区https://yq.aliyun.com/art ...
- Mysql Nested-Loop Join Algorithms
MySQL在多表之间执行join时,利用一种nested-loop algorithm 或者其变种:(嵌套循环) Nested-Loop Join Algorithm 一个简单的嵌套循环连 ...
- [one day one question] nodejs require 缓存,无法检测文件变化
问题描述: nodejs require 缓存,无法检测文件变化,当文件require引入后,当文件发生变动后即使再次使用require,返回的依然是第一次引入的文件内容,这怎么破? 解决方案: de ...
- CentOs下安装PHP扩展curl
服务器运行一段时间后,可能突然会需求添加某个扩展,如curl.pdo.xmlrpc等,这就需要在不重新编译Linux PHP的情况下独立添加扩展. 1.安装crul wget http://curl. ...
- CSS深入理解学习笔记之relative
1.relative和absolute的相煎关系 限制作用:①限制left/top/right/bottom定位:②限制z-index层级:③限制在overflow下的嚣张气焰. relative和f ...
- Long转Date/页面自定义标签
运行时发现异常:org.apache.jasper.JasperException: javax.el.ELException: java.lang.IllegalArgumentException: ...
- MySQL存储过程中declare和set定义变量的区别
在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...
- jenkins构建自由风格项目[四]
标签(linux): jenkins 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 构建一个php项目 创建一个新的项目 选择从git获取源码 配置gitlab ...
- 第三方模块paramiko的使用
"Paramiko" is a combination of the Esperanto words for "paranoid" and "frie ...
- JS-使用工厂方法创建对象
function createPerson(name,age,gender){ //创建新对象 var obj=new Object(); //向对象中添加属性 obj.name=name; obj. ...