`
iavere
  • 浏览: 11110 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

解读IO复制大文件

阅读更多
开篇几个问题:

你所知道的IO的内容有哪些?假设给你一个任务快速复制大文件甚至是超大文件,你怎么应对?你用什么技术实现?在巨多无比及其变态的用户下载这个文件的时候,你怎么解决这个问题?



如果你还不能回答完整第一个问题,那么即使你学了N久,那你也还没有入门。假设你能回答第二个问题你基础还行,假设你能回答并且能实现第三个和第四个问题你就是已经比较强大了。



作为一个常用的IO技术---通道技术,很多人都不甚了解,尤其是那些初学者认为IO及其简单。

今天写这篇文章的目的很明确,就是很大家分享一种高层的IO技术---通道技术。

在大家看过的视频甚至很多书上对这个没有怎么涉及,网上的资料也不是很多,更不用说可用了,所以有必要在此和大家分享。





第一步:在网上找关于通道的文章(注意搜索的技巧否则你找不到这方面的答案,只能看到N多人问的问题),了解一下IO通道的基本原理。

第二步: 扎实你的面相对象思想。

第三步:且看以下源码:



package cn.ccsu.cooole.util;



import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.FileOutputStream;

import java.nio.ByteBuffer;

import java.nio.channels.FileChannel;

/**

*

* @author CoolPrince

*

* 描述读取大的流文件这个类利用的是通道的技术

* 测试的时的赋值速度大概是6M/s;(这个根据具体的机器而定)

*

*/

public class ChannelCopy {

   //设置缓冲区的大小

    private static final int BSIZE = 1024;

   

    /**

     *

     * @param fileFrom :要被复制文件全限名

     * @param fileTo :要复制到目的地的文件全限名

     * @return boolean 返回复制成功与否的信息

     *

     */

    @SuppressWarnings("finally")

    public static boolean copyFile(String fileFrom, String fileTo) throws FileNotFoundException,IOException{

       boolean flag = true;//初始化返回文件复制成功与否的信息标志

       File file = new File(fileFrom); //源文件名

        FileChannel in = null, out = null; //通道初始化

       try {

           in = new FileInputStream(file).getChannel(); //获取文件通道

           out = new FileOutputStream(new File(fileTo)).getChannel();     //  得到输出流的通道       

       } catch (FileNotFoundException e) {

           flag = false;//此时文件没有找到故将此设置为false

           throw new FileNotFoundException(e.getMessage());    

       }     

        try {

            ByteBuffer buff  = ByteBuffer.allocate(BSIZE); //分配缓冲区的大小

              while(in.read(buff) != -1){ //一直读到文件的结尾的地方

                   buff.flip();//将缓冲区的内容“倒出来”

                   out.write(buff);//将缓冲区的内容直接写到目标文件中

                   buff.clear();//清除缓冲区的内容

               }    

              in.close();//关闭输入流

           } catch (IOException e) {

              flag = false;

              throw new IOException(e);

           }

       return flag;

      

    }

    /**

     * 第二种方式对copyFile进行重载 一适应用户传入文件时的情况

     * 使其更为通用

     * 具体解释参考上面的内容

     * @param fileFrom :要被复制文件

     * @param fileTo :要复制到目的地的文件

     * @return boolean 返回复制成功与否的信息

     *

     */

    @SuppressWarnings("finally")

    public static boolean copyFile(File fileFrom,File fileTo) throws FileNotFoundException,IOException{

       boolean flag = true;    

        FileChannel fc = null, out = null;

       try {

           fc = new FileInputStream(fileFrom).getChannel();

           out = new FileOutputStream(fileTo).getChannel();

          

       } catch (FileNotFoundException e) {

           flag = false;

           throw new FileNotFoundException(e.getMessage());    

       }  

       ByteBuffer buff  = ByteBuffer.allocate(BSIZE);

         try {

           while(fc.read(buff) != -1){

               buff.flip();

               out.write(buff);

               buff.clear();

            }    

           out.close();

           fc.close();

       } catch (IOException e1) {

           flag = false;

           throw new IOException(e1);

       }

          return flag;                

    }

    /**

     *

     * 直接将一个通道和另一个通道进行相连

     * 这里是从fileFrom到fileTo 利用tansferTo进行拷贝

     * 被拷贝的是fileFrom,新的文件是fileTo

     * @param fileFrom

     * @param fileTo

     * @return boolean

     * @throws FileNotFoundException

     * @throws IOException

     */

    public static boolean tansferTocopyFile(File fileFrom,File fileTo) throws FileNotFoundException,IOException{

       boolean flag = true;    

        FileChannel fc = null, out = null;    

           try {

              fc = new FileInputStream(fileFrom).getChannel();

              out = new FileOutputStream(fileTo).getChannel();

             

           } catch (FileNotFoundException e) {

                flag = false;

                throw new FileNotFoundException(e.getMessage());

           }  

           try {

              fc.transferTo(0,fc.size(),out);

           } catch (IOException e1) {

              flag = false;

              throw new IOException(e1);

           }

          return flag;                

    }

    /**第二种方式对tansferTocopyFile进行重载 一适应用户传入文件时的情况

     * 使其更为通用

     * 直接将一个通道和另一个通道进行相连

     * 这里是从fileTo到fileFrom 利用tansferFrom进行拷贝

     * 被拷贝的是fileFrom,新的文件是fileTo

     * 具体解释参考上面的内容

     * @param fileFrom

     * @param fileTo

     * @return boolean

     * @throws FileNotFoundException

     * @throws IOException

     */

    public static boolean tansferFromcopyFile(File fileFrom,File fileTo) throws FileNotFoundException,IOException{

       boolean flag = true;    

        FileChannel fc = null, out = null;    

           try {

              fc = new FileInputStream(fileFrom).getChannel();

              out = new FileOutputStream(fileTo).getChannel();

             

           } catch (FileNotFoundException e) {

                flag = false;

                throw new FileNotFoundException(e.getMessage());

           }  

           try {

              out.transferFrom(fc,0,fc.size());

           } catch (IOException e1) {

              flag = false;

              throw new IOException(e1);

           }

          return flag;                

    }

}

第四步:自己将其实现 并写成多线程的 慢慢体会

第五步:看下下面的这篇文章(《浅析学习技术的误区》) http://hi.baidu.com/voyage_mh/blog/item/933f2407b6565c7303088161.html)或许对你有所帮助,无论是学习技术的还是做其他事的。限于博客的篇幅限制,以及时间紧张的关系我也就此驻笔,希望对你有所帮助。


<转>
分享到:
评论

相关推荐

    Java IO流完整解读

    4. **第三方库Apache Commons IO**:在`FileCopyByCommonsTest()`方法中,使用了Apache Commons IO库的`IOUtils.copy()`方法,它提供了一种简洁的方式来复制文件,包括多张图片的批量复制。这个库提供了很多实用的I/...

    Java中IO解读与使用实例-动力节点共17页.pdf

    本篇文章将详细解读Java IO,并通过实例深入理解其使用方法。 Java IO API提供了丰富的类和接口,使得开发者可以有效地与外部资源进行交互,包括文件、网络、内存缓冲区等。在Java的IO体系中,主要有两种流:字节流...

    一个IO的传奇一生

    ### 一个IO的传奇一生...通过对《一个IO的传奇一生》的深入解读,我们不仅能够更加全面地理解文件系统的工作原理,也能深刻体会到在现代信息技术领域中,每一次成功的操作背后凝聚了多少工程师的辛勤努力和技术积累。

    struts2 的类库 commons-io-1.3.2 源码

    本文将详细解读`commons-io-1.3.2`版本的源码,帮助开发者深入了解其实现原理,提升对IO操作的理解。 首先,Commons IO库的核心理念是提供一系列与平台无关的、用于处理输入/输出流的工具类。这些工具类涵盖了文件...

    vsio绘图设备图标集

    5. **导入与使用**:用户可以从其他文件(如这里的"彩色.ppt")中导入图标到Visio,通过复制粘贴或者直接链接的方式将图标应用到网络图中。 6. **PowerPoint集成**:虽然Visio是专门的绘图工具,但PowerPoint也可以...

    java复制文件和java移动文件的示例分享

    本文将详细解读如何使用Java实现文件复制和移动功能,特别是针对特定类型文件(如jar文件)的复制操作。 首先,Java通过java.io包提供了基本的文件操作功能,例如File类、FileFilter接口、FileInputStream和...

    laurenstinson4_github_io-源码.rar

    7. **许可证**:在项目根目录下查找LICENSE文件,我们可以知道Laurenstinson4发布的源码遵循哪种开源许可协议,这关系到其他人能否复制、修改或商业使用这些代码。 8. **部署与构建流程**:通过阅读README.md文件或...

    c#文件同步

    - 使用 `CopyTo` 方法复制文件,并允许覆盖同名文件。 - 标记同步状态,用于控制后续流程。 #### 四、扩展与优化建议 - **性能优化**:可以考虑引入多线程或异步处理机制来提高文件复制的速度。 - **错误处理**...

    j2me程序读取文件

    在J2ME中,文件访问主要通过`javax.microedition.io.FileConnection`接口实现。该接口提供了一组方法用于打开、关闭、读取、写入文件等功能,并且支持多种文件系统。对于资源受限的设备而言,J2ME提供了一种轻量级的...

    ETG5001-6220-V1i0i5-S-R-IO-LinkMaster.pdf

    文档提到“Modular Device Profile Part 6220: IO-Link Master”,这意味着ETG5001_6220 IO-Link Master遵循一套标准化的模块化设备配置文件,以便于集成和互操作性。 ##### 3.2 适用场景 由于ETG5001_6220 IO-...

    第2章-文件操作——源码.7z

    7. 大文件处理:当文件过大无法一次性加载时,可以使用缓冲区或逐块读写。 8. 文件对象方法:如`flush()`强制将缓冲区的数据写入文件,`truncate()`截断文件。 9. 模块使用:Python的`shutil`模块提供高级文件操作...

    安卓Android源码——文件管理器.zip

    3. **文件操作**:包括创建新文件、删除文件、重命名文件、移动文件和复制文件等。这些操作需要调用`java.io.File`类的方法,如`createNewFile()`, `delete()`, `renameTo()`等,并结合Intent或者ContentResolver来...

    Netty5.0架构剖析和源码解读

    2. **poll**:相比select,poll没有文件描述符的最大限制,但是每次调用都需要将所有文件描述符复制到内核空间,效率相对较低。 3. **epoll**:是Linux 2.6内核版本提供的新型IO复用机制,相比于select和poll,epoll...

    c++/MFC文件拷贝

    此段代码使用了`_findfirst`和`_findnext`函数来查找指定目录下的所有匹配文件,并利用`CopyFile`函数将找到的每个文件从源目录复制到目标目录。需要注意的是,`CopyFile`函数的第三个参数表示是否覆盖同名文件,...

    RocketIO Design Kit for HyperLynx User Guide (Eldo).pdf

    这份文档包含Mentor Graphics公司的商业秘密和专有信息,受其许可条款约束,并且禁止未经许可的复制、分发或提供给第三方。 1. **简介** 文档的开头部分(第3页)可能介绍RocketIO Design Kit的基本概念,解释它是...

    Java思维导图xmind文件+导出图片

    CDN静态文件访问 分布式存储 分布式搜索引擎 应用发布与监控 应用容灾及机房规划 系统动态扩容 分布式架构策略-分而治之 从简到难,从网络通信探究分布式通信原理 基于消息方式的系统间通信 理解通信协议...

    CJ CS模拟量IO单元操作手册

    根据提供的文件内容,以下是一些详细的...由于文件内容的不完整,以上知识点根据提供的部分进行了整理和解读,某些具体操作步骤和数据交换细节未能详述。在实际应用中,手册应完整阅读,并在专业人士的指导下使用产品。

    Java Methods-Streams and Files.ppt

    操作系统负责维护文件,提供查看文件目录、复制、移动、重命名和删除文件的命令或图形用户界面工具。同时,操作系统也提供了可从程序调用的底层函数来读写文件和目录。 接下来,我们区分文本文件和二进制文件。从...

    EUREG.github.io:EUREG.github.io

    【描述】"EUREG.github.io EUREG.github.io" 是重复的描述,没有提供额外的信息,可能是由于复制粘贴错误导致的。通常,GitHub Pages网站的描述会包含网站的主题、目的或者主要内容的简短概述。 【标签】"HTML" ...

Global site tag (gtag.js) - Google Analytics