然而,当我们需要对磁盘上的文件进行处理的时候,这是一个很重要的方法。在这个时候我们往往不得不自己实现这样一个完成文件复制 *** 作的方法。下面将会介绍4种常见的文件复制的实现,并比较下它们的性能。
能找到的最常见经典例子。从文件A的输入流读取一批字节,写到文件B的输出流。
如你所见,这种实现方式需要多次读取数据,再写入将数据写入,因此受限于我们提供的buffer的大小,他的效率有点一般。
Java NIO类库里引入了一个叫 transferFrom 的方法,文档里说这是一个会比 FileStream 方式更快的复制 *** 作。
Appache Commons IO 提供了一个 FileUtils.copyFile(File from, File to) 方法用于文件复制,如果项目里使用到了这个类库,使用这个方法是个不错的选择。它的内部也是使用Java NIO的 FileChannel 实现的。
如果对Java 7 的使用有经验的话,那应该接触过 Files 这个工具类。
由于项目里没用到 Apache Common IO ,Android仅支持 Java 7 的语法特性,因此我只测试了前两种,数据如下:
复制文件,大小2M
复制文件,大小4.5M
复制文件,大小8M
复制文件,大小161M
从数据上可以看出,使用 FileStream 的方式,复制的效率跟我们的buffer大小取值关系很大,这无疑加大了我们使用它进行文件复制的负担。
而NIO的方式则不然,无论是小文件、还是大文件,它的效率都跟我们测试 FileStream 的最好水平相当!
因此,把 FileStream 这种老旧的实现方式从项目里挪走吧,是时候用上 FileChannel 了。
2016年06月16日 14:04 更新
大致就是从输入里映射一部分作为buffer,写到输出去,Buffer的大小最大为8388608,如果剩余的文件长度小于这个值,则用剩余文件长度的大小为buffer大小,继续写入,直到完全写完。
需要注意到的是,buffer并不是我们平时使用的byte数组,而是 MappedByteBuffer 对象,这是 java nio 引入的文件内存映射方案,读写性能很高。
万物皆字节。
使用
BufferedInputStream[缓冲区输入流]
BufferedOutputStream[缓冲区输出流]
这两个流是内置了缓冲区流,也就是说内部有一个 字节数组
直接使用
FileInputStream 文件输入流
FileOutputStream 文件输出流
然后new一个byte[],用来储存移动字节
while(( b = xxx1.read()) != -1){
xxx2.write(b)
}
这样两种方法,实现文件的复制(先要定一个文件路径,不然程序找不到文件)
如果要复制文件夹,可以使用递归,里面夹杂文件复制。
——如果对你有帮助,请采纳,谢谢
package tv.bilibiliimport java.io.File
import java.io.FileInputStream
import java.io.IOException
import java.io.FileOutputStream
public class IoPlay {
public static void main(String[] args) throws IOException{
File f = new File("E:\\新建文本文档.txt")
File f1 = new File("D:\\")
IoPlay io = new IoPlay()
io.copy(f,f1)
}
public void copy(File f,File f1) throws IOException{//复制文件的方法!
if(!f1.exists()){
f1.mkdir()
}
if(!f1.exists()){//路径判断,是路径还是单个的文件
File[] cf = f.listFiles()
for(File fn : cf){
if(fn.isFile()){
FileInputStream fis = new FileInputStream(fn)
FileOutputStream fos = new FileOutputStream(f1 + "\\" +fn.getName())
byte[] b = new byte[1024]
int i = fis.read(b)
while(i != -1){
fos.write(b, 0, i)
i = fis.read(b)
}
fis.close()
fos.close()
}else{
File fb = new File(f1 + "\\" + fn.getName())
fb.mkdir()
if(fn.listFiles() != null){//如果有子目录递归复制子目录!
copy(fn,fb)
}
}
}
}else{
FileInputStream fis = new FileInputStream(f)
FileOutputStream fos = new FileOutputStream(f1 + "\\" +f.getName())
byte[] b = new byte[1024]
int i = fis.read(b)
while(i != -1){
fos.write(b, 0, i)
i = fis.read(b)
}
fis.close()
fos.close()
}
}
}
以上是我自己写的,讲一个文件复制到例外一个地方,无论是文件,还是文件夹都可以
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)