java文件拷贝_Java实现文件拷贝的4种方法

第一种方法:古老的方式

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=(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=(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!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

今夜的硬件之旅

6脚继电器&#xff1a; 汇科继电器HK4100F-DC6V-SHG ①3A触点切换能力 ②具有一组常开&#xff0c;一组转换触点形式 ③超小型&#xff0c;标准印刷制版引出脚 ④有塑封型 Outline&#xff08;L*W*H&#xff09;外形尺寸&#xff1a;15.510.511.8 Contact Date触电形式&#…

mp3 pcm java_Java mp3文件转pcm文件

Java mp3文件转pcm文件package cn.zpy.util;import java.io.File;import java.io.IOException;import javax.sound.sampled.AudioFileFormat;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;imp…

有1~5000一组乱序数列,请使用伪代码对该数进行排列

先把1-5000组成一个数组 冒泡排序法 $arrarray(1,2,3,4,5,6,7,8,9.....5000); $totalcount($arr); For($i0;$i<$total;$i){ For($j0;$j<$total-1;$j){ If($arr[$j]>$arr[$j1]){ $tmp$arr[$i]; $arr[$j]$arr[$j1]; $arr[$j1]$tmp; } } } 快速排序法 $arrarray(1,2,3,4,…

java 类型转换方法_java数据类型转换的常见方法

public class Testfun {public static void main(String[] args) {// (一)跨Number父类的类型转换// 1、str转int > Integer.parseInt(s1)String s1 "19";int i2 Integer.parseInt(s1);// 数字str转化为对标的intSystem.out.println("i2" (i2));// 2…

json to java 在线_Json转Java对象 (全网最简版)

Json2Java(全网最简版)json字符串转Java对象,生成对应文件描述&特点简易的Json转Java工具,满足基本日常使用(特殊需求可自行增添,代码就一页)在网上找了好些个这类工具,不是只暴露iead插件就是复杂&没文档,于是自己写了个全网最简版Json2Javaonly one file用法public c…

Material design 色彩

八月已过去&#xff0c;九月刚来到~暑假已过去~九月上学季~~又迎来了一个桂花飘香的季节&#xff0c;你是否有了新的目标和计划~~所以在九月初始给大家带来一个全新的东西&#xff08;ps&#xff1a;对于我来说是全新的东西&#xff09;——Material Design~~九月让我们一起好好…

java logging api_Java Logging API - Tutorial

1.2. 创建一个logger包 java.util.logging提供了日志的功能&#xff0c;可以使用类似于下面的代码来创建一个logger&#xff1a;import java.util.logging.Logger;private final static Logger LOGGER Logger.getLogger(MyClass.class .getName());1.3. LevelLog的等级反映了问…

内存查看工具RAMMAP说明

参考 Technet Process Private: 分配给单一Process专用的内存 Mapped File: 用来储放档案内容快取(Cache)的内存空间 Shared Memory: 标注给多个Process共用的内存分页(Page&#xff0c;内存管理单位) Page Table: 用来描述虚拟内存位址的分页表(裡面是一笔一笔的PTE&…

php接口和java接口_java和php接口的区别是什么

java和php接口的区别是&#xff1a;1、php接口中的抽象方法只能是public的&#xff0c;默认也是public权限&#xff1b;2、java中私有方法使用private修饰&#xff0c;供接口中的默认方法或者静态方法调用。【相关学习推荐&#xff1a;php编程(视频)】php:规范&#xff1a;接口…

成都优步uber司机第四组奖励政策

万能的优步成都团队放出了优步司机第四组&#xff0c;一二三组奖励已经骤降&#xff0c;在月末放出第四组车主档&#xff0c;这是要让一切归于平静的节奏么&#xff01;&#xff01;&#xff01; 滴滴快车单单2.5倍&#xff0c;注册地址&#xff1a;http://www.udache.com/如何…

java hql多条件查询_使用hql语句怎样实现多条件查询

展开全部这里只写了DAO和业务62616964757a686964616fe59b9ee7ad9431333264623331逻辑组件、ACTION的具体实现类&#xff0c;PO和和接口自己应该会写吧&#xff0c;HQL采用的是结合SQL的那种写法&#xff0c;增删改查全在里面了&#xff0c;修改下马上就能跑了&#xff0c;不清楚…

BZOJ 1008 [HNOI2008]越狱

1008: [HNOI2008]越狱 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5166 Solved: 2242[Submit][Status][Discuss]Description 监狱有连续编号为1...N的N个房间&#xff0c;每个房间关押一个犯人&#xff0c;有M种宗教&#xff0c;每个犯人可能信仰其中一种。如果相邻房间…

android mysql开发工具_Android开发工具--adb的使用

adb(Android Debug Bridge)是Android提供的一个通用的调试工具&#xff0c;借助这个工具&#xff0c;我们可以管理设备或手机模拟器的状态。还可以进行以下的操作&#xff1a;1、快速更新设备或手机模拟器中的代码&#xff0c;如应用或Android系统升级&#xff1b;2、在设备上运…

java headless_使用Chrome Headless 快速实现java版数据的抓取

Java: cdp4j - Java library for CDP,使用这个类库实现。maven引入&#xff1a;io.webfoldercdp4j1.1.0官方例子&#xff1a;import io.webfolder.cdp.Launcher;import io.webfolder.cdp.session.Session;import io.webfolder.cdp.session.SessionFactory;public class HelloWo…

闪回数据库

Flashbacking a database means going back to a previous database state.闪回数据库到之前数据库的状态The Flashback Database feature provides a way to quickly revert entire Oracle database to the state it was in at a past point in time. 闪回数据库特性提供了一种…

Ruby on Rails Tutorial 第六章 用户模型

1、用户模型&#xff08;1&#xff09;数据库迁移Rails默认使用关系数据库存储数据&#xff0c;数据库中的表有数据行组成&#xff0c;每一行都有相应的列&#xff0c;对应数据属性。把列名命名为相应的名字后&#xff0c;ActiveRecord会自动把他们识别为用户对象的属性。 $ ra…

java dcl 失效解决_DCL失效原因和解决方案

Java内存模型 在了解Java的同步秘密之前&#xff0c;先来看看JMM(Java Memory Model)。Java被设计为跨平台的语言&#xff0c;在内存管理上&#xff0c;显然也要有一个统一的模型。而且Java语言最大的特点就是废除了指针&#xff0c;把程序员从痛苦中解脱出来&#xff0c;不…

李宁-2015年7月13日-个人文档

姓名 李宁 日期 2015年7月13日 主要工作及心得 由于我负责服务器端的编写工作&#xff0c;而各部分的客户端的操作都要与服务器端通信&#xff0c;所以在今天的调试中&#xff0c;我贯穿于各部分模块的调试和检测&#xff0c;主要负责在出现问题…

java.net.unknown_android -------- java.net.UnknownServiceException

最近升级了Android的API版本时 &#xff0c;导致我的网络请求失败了&#xff0c;出现了这个错误 java.net.UnknownServiceException&#xff0c;这个错误&#xff0c;我在网上查到这个主要是由于&#xff0c;我们的OkHttp3会默认使用密文传输&#xff0c;而我们的代码中使用Htt…

无忧开通了博客园博客主页

无忧开通了博客园博客主页&#xff0c;今后在这里安家了。 分享一点工作经验和学习心得&#xff0c;有事没事常来看看。另一个独立博客www.wuyouseo.com 转载于:https://www.cnblogs.com/wuyoublog/p/4646481.html