社区
非技术区
帖子详情
求IO包的应用
xuanhua66
2010-10-20 05:53:03
怎么将C盘下的一个文件夹复制到D盘(应用IO里面的类 方法 实现 把C盘下的某个文件里面的东西全部复制到D盘)!请高手教教
...全文
81
5
打赏
收藏
求IO包的应用
怎么将C盘下的一个文件夹复制到D盘(应用IO里面的类 方法 实现 把C盘下的某个文件里面的东西全部复制到D盘)!请高手教教
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xuanhua66
2010-10-21
打赏
举报
回复
那个貌似时间是比较快 。。。我自己也写了一个。。。。。
不过我对 文件(包括文件夹 )所有的拷贝。。。
用的是递归 。。。
不过还是谢谢 上面的二位 。。。。。
站在不同的角度想 。。
呵呵
weiguoxin
2010-10-21
打赏
举报
回复
递归.
判断此文件是文件还是文件夹,文件夹则获取此文件夹下文件列表,文件则进行复制操作.
njclsc
2010-10-21
打赏
举报
回复
使用 java 进行文件拷贝 相信很多人都会用,不过效率上是否最好呢?最近看了看NIO决定试一试 java NIO 到底有什么性能的提升.
第一种方法:古老的方式
public static long forJava(File f1,File f2) throws Exception{
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
FileOutputStream out=new FileOutputStream(f2);
byte[] buffer=new byte[length];
while(true){
int ins=in.read(buffer);
if(ins==-1){
in.close();
out.flush();
out.close();
return new Date().getTime()-time;
}else
out.write(buffer,0,ins);
}
}
方法的2参数分别是原始文件,和拷贝的目的文件.这里不做过多介绍.
实现方法很简单,分别对2个文件构建输入输出流,并且使用一个字节数组作为我们内存的缓存器, 然后使用流从f1 中读出数据到缓存里,在将缓存数据写到f2里面去.这里的缓存是2MB的字节数组
第2种方法:使用NIO中的管道到管道传输
public static long forTransfer(File f1,File f2) throws Exception{
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
FileOutputStream out=new FileOutputStream(f2);
FileChannel inC=in.getChannel();
FileChannel outC=out.getChannel();
int i=0;
while(true){
if(inC.position()==inC.size()){
inC.close();
outC.close();
return new Date().getTime()-time;
}
if((inC.size()-inC.position())<20971520)
length=(int)(inC.size()-inC.position());
else
length=20971520;
inC.transferTo(inC.position(),length,outC);
inC.position(inC.position()+length);
i++;
}
}
实现方法:在第一种实现方法基础上对输入输出流获得其管道,然后分批次的从f1的管道中像f2的管道中输入数据每次输入的数据最大为2MB
方法3:内存文件景象写(读文件没有使用文件景象,有兴趣的可以回去试试,,我就不试了,估计会更快)
public static long forImage(File f1,File f2) throws Exception{
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
RandomAccessFile out=new RandomAccessFile(f2,"rw");
FileChannel inC=in.getChannel();
MappedByteBuffer outC=null;
MappedByteBuffer inbuffer=null;
byte[] b=new byte[length];
while(true){
if(inC.position()==inC.size()){
inC.close();
outC.force();
out.close();
return new Date().getTime()-time;
}
if((inC.size()-inC.position())<length){
length=(int)(inC.size()-inC.position());
}else{
length=20971520;
}
b=new byte[length];
inbuffer=inC.map(MapMode.READ_ONLY,inC.position(),length);
inbuffer.load();
inbuffer.get(b);
outC=out.getChannel().map(MapMode.READ_WRITE,inC.position(),length);
inC.position(b.length+inC.position());
outC.put(b);
outC.force();
}
}
实现方法:跟伤2个例子不一样,这里写文件流没有使用管道而是使用内存文件映射(假设文件f2在内存中).在循环中从f1的管道中读取数据到字节数组里,然后在像内存映射的f2文件中写数据.
第4种方法:管道对管道
public static long forChannel(File f1,File f2) throws Exception{
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
FileOutputStream out=new FileOutputStream(f2);
FileChannel inC=in.getChannel();
FileChannel outC=out.getChannel();
ByteBuffer b=null;
while(true){
if(inC.position()==inC.size()){
inC.close();
outC.close();
return new Date().getTime()-time;
}
if((inC.size()-inC.position())<length){
length=(int)(inC.size()-inC.position());
}else
length=2097152;
b=ByteBuffer.allocateDirect(length);
inC.read(b);
b.flip();
outC.write(b);
outC.force(false);
}
}
这里实现方式与第3种实现方式很类似,不过没有使用内存影射.
下面是对49.3MB的文件进行拷贝的测试时间(毫秒)
Start Copy File... file size:50290KB
CopyFile:b1.rmvb mode:forChannel RunTime:3203
CopyFile:b1.rmvb mode:forImage RunTime:3328
CopyFile:b1.rmvb mode:forJava RunTime:2172
CopyFile:b1.rmvb mode:forTransfer RunTime:1406
End Copy File!
解释: 在测试结果中看到 古老方式,和管道向管道传输是最快的,,,,,为什么呢?
我分析是这样的,由于另外2种方法内部都使用了 字节数组作为缓存中转,在加上NIO内部有一个贴近系统的缓存区,这无意就增加了另一个缓存器,所以相对于这2个方法就要慢许多,,如果不使用 字节数组作为数据中转的话相信速度会更快的..
不过比较惊讶的是 管道向管道传输的速度还是真挺吓人,,,
xuanhua66
2010-10-21
打赏
举报
回复
用二进行制流来读写就可以了,....
这个我是刚刚学的 。。。具体点咯。。。。。谢谢
myisfei
2010-10-20
打赏
举报
回复
用二进行制流来读写就可以了,
commons-fileupload-1.2.1.jar和commons-
io
-1.3.2.jar程序文件
Apache Commons FileUpload与Apache Commons
IO
是Java开发中用于处理文件上传功能的重要库。这两个库在Web
应用
程序中尤其常见,因为它们提供了处理HTTP请
求
中的多部分数据(如表单上传的文件)的便捷方法。 `...
spring MVC框架所需的所有jar
包
。(完整版)
Spring MVC是Spring框架的一个核心模块,专为构建Web
应用
程序而设计。它提供了模型-视图-控制器(MVC)架构模式的实现,帮助开发者轻松处理HTTP请
求
、数据绑定、视图渲染等任务。这个压缩
包
包
含了一系列jar
包
,它们...
httpclient-4.5所需jar
包
8. **其他可能的依赖库**:根据实际需
求
,可能还需要
包
括其他Apache Commons库(如collect
io
ns、codec、
io
等)或者SSL相关的jar
包
,以支持特定的功能,如身份验证、加密通信等。 在Java开发环境中,将这些jar
包
添加...
draw.
io
资源
包
V2022深度解析与
应用
简介:draw.
io
是一个功能全面的在线绘图工具,适用于创建各种...本文深入探讨draw.
io
核心特性和资源
包
的
应用
,旨在指导用户通过安装最新版本和学习新图形模板来提高工作效率。 1. draw.
io
概述及其易用性 ...
golang
IO
流抽象与
应用
文章目录golang
IO
流抽象与
应用
1、
io
.go 源代码与
IO
流抽象1.1
io
包
的职责1.2
IO
操作原语定义与基础接口1.3 实用
IO
处理函数1.4 典型的
应用
结构2、
IO
抽象与流处理
应用
2.1 装饰模式2.2 字符流2.3 二进制流3、小...
非技术区
23,406
社区成员
70,514
社区内容
发帖
与我相关
我的任务
非技术区
Java 非技术区
复制链接
扫一扫
分享
社区描述
Java 非技术区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章