社区
非技术区
帖子详情
求IO包的应用
xuanhua66
2010-10-20 05:53:03
怎么将C盘下的一个文件夹复制到D盘(应用IO里面的类 方法 实现 把C盘下的某个文件里面的东西全部复制到D盘)!请高手教教
...全文
69
5
打赏
收藏
求IO包的应用
怎么将C盘下的一个文件夹复制到D盘(应用IO里面的类 方法 实现 把C盘下的某个文件里面的东西全部复制到D盘)!请高手教教
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
用二进行制流来读写就可以了,
IO
-3.6.linux
应用
编程和网络编程第6部分
本课程讲解linux中的
IO
部分,
包
括非阻塞
IO
、多路复用
IO
、异步
IO
和内存映射
IO
等。本课程目标是让大家对并发情况下阻塞式
IO
的困境有所认识,并且能够理解并运用几种常用手段去解决之。
Netty权威指南读书笔记(☆☆☆)
文章目录Netty权威指南读书笔记(☆☆☆)
IO
基础入门Linux的
IO
模型简介
IO
多路复用技术Java的
IO
演进N
IO
入门传统的B
IO
编程伪异步
IO
A
IO
编程选择Netty的理由原生N
IO
的缺点Netty 入门
应用
TCP粘
包
/拆
包
问题的解决之道解决粘
包
问题代码实现分隔符和定长解码器的
应用
DelimiterBasedFrameDecoder
应用
开发FixedLengthFrameDecoder固定...
Java的
IO
包
Java的
IO
包
目录1
IO
包
1.1 File类1.1.1 File类的介绍1.1.2 File类的静态成员变量1.1.3 File类的静态成员变量1.1.4 File的构造方法(重点)1.1.5 File类的成员方法1.1.5.1 获取功能的方法(重点)1.1.5.2 判断功能的方法(重点)1.1.5.3 创建删除功能的方法(重点)1.1.5.4 目录遍历的方法(重点)1.1.6 文件大小和文件 占用磁盘空间1.2 递归1.2.1 递归概述1.2.2 递归
求
1-n和1.2.3 递归
求
阶乘1.2.3 递归遍
java中的错误流_java的字符
IO
流中遇到问题,
求
高人指点!!!!
图示代码内容正常输入输出,但是有异常提示:
求
高人指点!!!!以下是文本代码:importjava.
io
.*;//导入
IO
类所在
包
classtestChar{publicstaticvoidmain(Stringargs[]){FileReaderfr=...图示代码内容正常输入输出,但是有异常提示:
求
高人指点!!!!以下是文本代码:import java.
io
.*; ...
通俗易懂的JUC线程高级教程(含配套资料)
本教程为授权出品教程本Java视频主要讲授Java JUC线程部分的内容:针对 Java 5.0 提供的 java.util.concurrent (简称 JUC )
包
中的线程的高级
应用
。 在此
包
中增加了在并发编程中常用的实用工具类,用于定义类似于线程的自定义子系统,
包
括线程池、异步
IO
和轻量级任务框架。提供可调的、灵活的线程池。还提供了设计用于多线程上下文中的 Collect
io
n 实现等。
非技术区
23,402
社区成员
70,745
社区内容
发帖
与我相关
我的任务
非技术区
Java 非技术区
复制链接
扫一扫
分享
社区描述
Java 非技术区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章