原生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检查配置文档
为便于规范各位开发人员代码.提高代码质量,研发中心需要启动代码评审机制.为了加快代码评审的速度,减少不必要的时间,可以加入一些代码评审的静态检查工具,另外需要为研发中心配置统一的编码模板和代码格式化模 ...
随机推荐
- <script>的用法
<script> </script> 是指 在 HTML 页面中插入一段 JavaScript
- flask + Python3 实现的的API自动化测试平台---- IAPTest接口测试平台(总结感悟篇)
前言: 在前进中去发现自己的不足,在学习中去丰富自己的能力,在放弃时想想自己最初的目的,在困难面前想想怎么踏过去.在不断成长中去磨炼自己. 正文: 时间轴 flask + Python3 实现的的AP ...
- 免费ssl证书申请和在IIS上启用https的使用教程
因为微信小程序开发涉及到ssl证书,所以折腾了几天的这个. 非常感谢”亚洲诚信-TrustAsia“公司的售后工程师黄工(QQ2355718943 TEL:021-58895880-663)提供的技术 ...
- HTML中padding和margin的区别和用法
margin(外边距) 定义:margin是用来隔开元素与元素的间距,发生在元素本身的外部,margin用于布局分开元素使元素与元素互不相干. 提示:margin: top right bottom ...
- 浏览器http的缓存机制
原文出处-----分享从伯乐在线看到的一篇好文章 http://web.jobbole.com/85509/ 针对浏览器的http缓存的分析也算是老生常谈了,每隔一段时间就会冒出一篇不错的文章,其原 ...
- 【高并发简单解决方案】redis队列缓存 + mysql 批量入库 + php离线整合
需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化过程中,应用最新的框 ...
- spring的jar各包作用
http://yjwen337.blog.163.com/blog/static/3625847820106132949858/[转]spring.jar是包含有完整发布的单个jar 包,spring ...
- Windows下Nginx实现负载均衡
Apache,Nginx Apache和Nginx都属于属于 静态页面服务器,都有插件支持动态编程语言处理,但Nginx的IO模比Apache更适合跑代理.所以一般都作为前端缓冲代理(Nginx的反向 ...
- 关于Scanner类
Scanner类 1.常用的两个方法: public int nextInt():获取一个int类型的值 public String nextLine():获取一个St ...
- Servlet第六篇【Session介绍、API、生命周期、应用、与Cookie区别】
什么是Session Session 是另一种记录浏览器状态的机制.不同的是Cookie保存在浏览器中,Session保存在服务器中.用户使用浏览器访问服务器的时候,服务器把用户的信息以某种的形式记录 ...