`
JavaSam
  • 浏览: 951668 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA IO 字节流实现文件copy效率比较

    博客分类:
  • JAVA
 
阅读更多
package jonavin.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOUtil {

	/**
	 * 文件拷贝-- 一个字节一个字节拷贝
	 * @param srcFile
	 * @param destFile
	 */
	public static void copyFileByByte(File srcFile,File destFile) throws IOException{
		if(!srcFile.exists()){
			throw new IllegalArgumentException("文件:"+srcFile+"不存在!");
		}
		if(!srcFile.isFile()){
			throw new IllegalArgumentException(srcFile+"不是文件!");
		}
		FileInputStream in = new FileInputStream(srcFile);//源文件
		FileOutputStream out = new FileOutputStream(destFile);//目标文件
		int b;
		while ((b = in.read()) != -1) {
			out.write(b);//写入一个字节的低八位
		}
		in.close();
		out.close();
	}
	/**
	 * 拷贝文件一次读取多个字节
	 */
	public static void copyFileByByteBuf(File srcFile,File destFile) throws IOException{
		if(!srcFile.exists()){
			throw new IllegalArgumentException("文件:"+srcFile+"不存在!");
		}
		if(!srcFile.isFile()){
			throw new IllegalArgumentException(srcFile+"不是文件!");
		}
		FileInputStream in = new FileInputStream(srcFile);//源文件
		FileOutputStream out = new FileOutputStream(destFile);//目标文件
		int b;
		byte[] buf = new byte[8*1024];//开辟8K的缓存
		while ((b = in.read(buf,0,buf.length))!=-1) {
			out.write(buf, 0, b);
		}
		in.close();
		out.close();
	}
	/**
	 * 通过缓冲流copy文件
	 * @throws IOException
	 */
	public static void copyFileByBuffed(File srcFile,File destFile)throws IOException{
		if(!srcFile.exists()){
			throw new IllegalArgumentException("文件:"+srcFile+"不存在!");
		}
		if(!srcFile.isFile()){
			throw new IllegalArgumentException(srcFile+"不是文件!");
		}
		FileInputStream in = new FileInputStream(srcFile);//源文件
		FileOutputStream out = new FileOutputStream(destFile);//目标文件
		BufferedInputStream inbuf = new BufferedInputStream(in);
		BufferedOutputStream outbuf = new BufferedOutputStream(out);
		int b;
		while ((b = inbuf.read())!=-1) {
			outbuf.write(b);
		}
		in.close();
		out.close();
		inbuf.close();
		outbuf.close();
	}
	/**
	 * 通过缓冲流copy文件 缓冲流一次读取多个字节
	 * @throws IOException
	 */
	public static void copyFileByBuffedBuf(File srcFile,File destFile)throws IOException{
		if(!srcFile.exists()){
			throw new IllegalArgumentException("文件:"+srcFile+"不存在!");
		}
		if(!srcFile.isFile()){
			throw new IllegalArgumentException(srcFile+"不是文件!");
		}
		FileInputStream in = new FileInputStream(srcFile);//源文件
		FileOutputStream out = new FileOutputStream(destFile);//目标文件
		BufferedInputStream inbuf = new BufferedInputStream(in);
		BufferedOutputStream outbuf = new BufferedOutputStream(out);
		int b;
		byte[] buf = new byte[8*1024];
		while ((b = inbuf.read(buf,0,buf.length))!=-1) {
			outbuf.write(buf,0,b);
		}
		in.close();
		out.close();
		inbuf.close();
		outbuf.close();
	}
	
	/**
	 * 文件拷贝
	 * @param srcpath
	 * @param destpath
	 * @throws IOException
	 */
	public static void copyFile(String srcpath,String destpath)throws IOException{
		copyFileByBuffedBuf(new File(srcpath), new File(destpath));
	}
}

  
调用 : IOUtil.copyFile("C:\\apache-tomcat-7.0.57.zip", "c:\\ret.dat");//源文件大小9M

copyFileByByte  ----》 62229 毫秒
copyFileByByteBuf -----》 97 毫秒
copyFileByBuffed -----》 457 毫秒
copyFileByBuffedBuf ----》 28 毫秒

 

2
1
分享到:
评论
4 楼 四书五经 2014-12-25  
   博主这个程序基本没错,但是你的测试有很大问题,测试的时候不应该用同一个文件来测试,而是应该用不同的文件来测试,因为同一文件测试,除了第一次,后面的读取会有缓存导致的误差,所有你这个结果不准确的。
而且,最后其实不管是管道还是第三方包(apache io common 包)还是字节, 结果应该都是fileInputStream + buffer(类似你这里的copyFileByByteBuf)是最快的。
3 楼 随便小屋 2014-12-25  
      
2 楼 Even521 2014-12-25  
@Test 
public void testFileChanne(){ 
  FileInputStream fi = null; 
  FileOutputStream fo = null; 
  FileChannel in = null; 
  FileChannel out = null; 
  try { 
   fi = new FileInputStream("d:\\ff_copy.txt"); 
   fo = new FileOutputStream("d:\\ff_copy3.txt"); 
   in = fi.getChannel();//得到对应的文件通道 
   out = fo.getChannel();//得到对应的文件通道 
   in.transferTo(0, in.size(), out);//连接两个通道,并且从in通道读取,然后写入out通道 
  } catch (IOException e) { 
   e.printStackTrace(); 
  } finally { 
   try { 
    fi.close(); 
    in.close(); 
    fo.close(); 
    out.close(); 
   } catch (IOException e) { 
    e.printStackTrace(); 
   } 
  } 
1 楼 jilin 2014-12-24  
通过管道拷贝更快

相关推荐

    java io流源代码

    IO流在Java中分为两大类:字节流和字符流,每种流又有输入流和输出流之分。字节流处理的是8位的字节数据,而字符流处理的是16位的Unicode字符。 1. 字节流: - **InputStream** 和 **OutputStream** 是所有字节...

    JAVA 的IO流的文件复制

    本篇文章将详细讲解如何使用Java的IO流进行文件复制,以及如何实现整个文件夹的复制,并检查复制是否成功。 1. 单个文件复制: 在Java中,我们可以使用`java.io`包中的`FileInputStream`和`FileOutputStream`类来...

    java io读取文件

    - **流(Stream)**:Java IO基于流的概念,流是一组有序的数据序列,可以是字节流或字符流。数据从源(如文件)流向目的地(如内存)。 - **缓冲区(Buffer)**:为了提高效率,Java IO会使用缓冲区来临时存储...

    Java中的字节流.

    ### Java中的字节流 #### 一、字节流简介 ...通过以上介绍,我们可以看到Java中的字节流提供了非常灵活的方式来处理文件和其他数据源的读写操作。开发者可以根据具体需求选择合适的类来进行数据的处理。

    java零基础自学 之 JavaIO流处理

    Java的IO类主要分为两大类:字符流(Reader和Writer)和字节流(InputStream和OutputStream)。Reader和Writer是字符流的基类,InputStream和OutputStream则是字节流的基类。字符流处理单个字符,而字节流处理单个...

    java IO流详解

    ### Java IO流详解 #### 一、流的概述与分类 在Java中,流是一种抽象概念,用于描述数据从一个地方传输到另一个地方的过程。...无论是简单的文件复制还是复杂的目录拷贝,都能够通过Java IO流轻松实现。

    Java IO流完整解读

    Java IO库提供了丰富的类来实现对文件、网络、内存等不同源的数据读写。 标题中提到的"Java IO流完整解读"涵盖了Java中用于读写文件的各种方法和技术。以下是一些关键知识点: 1. **File类**:这是Java中处理文件...

    Java_IO.rar_IO流 java_java io流

    在Java中,IO流可以分为两类:字节流(处理单个字节)和字符流(处理Unicode字符)。此外,它们又可以分为四大类:输入流(用于读取数据)、输出流(用于写入数据)、节点流(与特定数据源或目的地关联)和过滤流...

    Java IO 编程集合

    它们是所有字节流类的基类,包括文件读写的相关类。 二、File类 2. File类:它是Java中处理文件和目录的主要类。通过File对象,我们可以创建、删除文件和目录,获取文件的基本信息(如大小、创建时间等),以及进行...

    java 复制文件 io流操作

    在Java编程语言中,文件复制是一项常见的任务,主要通过IO(Input/Output)流来实现。IO流提供了从一个源读取数据并将其写入另一个目的地的机制。在这个主题中,我们将深入探讨如何使用Java的IO流进行文件复制,重点...

    java IO数据流

    ### Java IO 数据流详解 #### 一、Java 文件操作基础 在Java中,进行文件操作主要依赖于`java.io.File`类。通过该类提供的方法,我们可以实现对文件和目录的基本管理,例如创建、删除、重命名文件或目录等。 **...

    Java IO commons-io-2.5.jar

    Java IO 包含了许多类,如InputStream、OutputStream、Reader、Writer等,它们分别用于处理字节流和字符流。字节流适用于二进制数据,而字符流适用于文本数据。Java IO 还包括Filter流,可以用来装饰其他流,添加...

    详解Java中IO字节流基本操作(复制文件)并测试性能

    Java中IO字节流基本操作(复制文件)并测试性能 Java中的IO字节流是一种基本的输入/输出操作,用于复制文件、读取文件、写入文件等操作。今天我们将详细介绍Java中IO字节流基本操作(复制文件)并测试性能。 Java...

    Java二进制IO类与文件复制操作实例

    在二进制IO中,我们主要关注字节流,包括输入流(InputStream)和输出流(OutputStream)。 2. **字节流的层次结构** 字节输入流(InputStream)的基类是`java.io.InputStream`,常见的子类有`FileInputStream`...

    commons-io-1.4.jar.zip_io流jar

    Java IO流体系结构分为四类:字节流(Byte Stream)、字符流(Character Stream)、对象流(Object Stream)和套接字流(Socket Stream)。字节流处理单个8位的字节,而字符流基于Unicode编码,处理16位的字符。对象...

    java_IO操作

    - `InputStreamReader`和`OutputStreamWriter`用于在字节流与字符流之间转换,它们接受一个字节流并指定字符集,以处理不同编码的文本文件。 6. **字符集**: - Java中的字符集通常是UTF-8,但可以通过`Charset`...

    java的io操作源代码

    在Java中,IO操作基于流(Stream)的概念,流是数据传输的通道,分为字节流和字符流两大类。字节流处理单个字节的数据,如InputStream和OutputStream;字符流处理Unicode字符,如Reader和Writer。它们又分别分为输入...

    io流详解代码

    - 使用`java.nio.file.Files`类的`copy`方法可以方便地实现文件复制,也可以通过字节流或字符流的组合实现复制,例如使用`FileInputStream`和`FileOutputStream`。 4. **对象序列化与反序列化**: - Java的序列化...

    标准字节流拷贝纯文本文件工具类

    `FileInputStream`和`FileOutputStream`是Java提供的两个核心类,分别用于读取和写入文件的字节流。这个名为"标准字节流拷贝纯文本文件工具类"的代码库可能包含了一些辅助方法,旨在简化使用这些类来复制纯文本文件...

    Java-IO.rar_java IO

    在Java中,实现文件拷贝可以通过使用`java.io`包中的`FileInputStream`和`FileOutputStream`类来完成。这两个类分别代表了文件的输入流和输出流。以下是一个简单的文件拷贝程序示例: ```java import java.io.*; ...

Global site tag (gtag.js) - Google Analytics