zoukankan      html  css  js  c++  java
  • java多线程实现复制大文件

    有些开发的时候我们经常遇到这样一个问题,对大文件的处理。比如:日志文件。那么十几G的大文件。我们应该如何复制呢?

    还有就是希望从本地和远程复制文件,文件都很大,10G级的如何办呢?

    在这里我告诉你们,可以用java多线程实现复制。

    原理:就是多线程把大文件分成小文件,实现快速复制。

    下面直接看代码:

    package com.huojg.test;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.io.Reader;
    
    /**
     * java用线程实现复制文件:就是复制大文件时,用多个线程把大文件分成小文件,实现快速复制
     * 
     * 
     * */
    public class CopyFile implements Runnable{
    
        @Override
        public synchronized  void run() {
            InputStream is;
            try {
                is = new FileInputStream("f:"+File.separator+"file1"+File.separator+"321.txt");
                Reader rd=new InputStreamReader(is,"gbk");
                BufferedReader br=new BufferedReader(rd);
                OutputStream os=
                        new FileOutputStream("f:"+File.separator+"file1"+File.separator+"1234.txt");
                OutputStreamWriter osw=new OutputStreamWriter(os,"gbk");
                String str="";
                while((str=br.readLine())!=null){
                    osw.write(str);
                    System.out.println(str);
                }
                osw.close();
                br.close();
                os.close();
                rd.close();
                is.close();
                System.out.println(Thread.currentThread().getName()+":复制完毕");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    测试类;

    package com.huojg.test;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class CopyFileText {
        public static void main(String[] args) {
            CopyFile cf=new CopyFile();
            ExecutorService es= Executors.newFixedThreadPool(3);
            es.execute(cf);
            es.execute(cf);
            es.execute(cf);    
            es.shutdown();
        }
    }

    这样子我们的多线程就完成了。

    下面说一下线程池:

    3、在使用线程池之前,必须知道如何去创建一个线程池,在Java5中,需要了解java.util.concurrent.Executors类的API,这个类提供大量创建连接池的静态方法,是必须掌握的。 

    一、固定大小的线程池,newFixedThreadPool:

    1. 创建一个可重用固定线程数的线程池  
    2. ExecutorService pool = Executors.newFixedThreadPool(5); 
    3. 然后将线程放入池中进行执行  
    4. 关闭线程池  pool.shutdown();

    二、单任务线程池,newSingleThreadExecutor: 

    每次调用execute方法,其实最后都是调用了thread-1的run方法。

    三、可变尺寸的线程池,newCachedThreadPool:

    这种方式的特点是:可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。

    四、延迟连接池,newScheduledThreadPool:

     // 创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。  
            ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);  
            // 创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口  
            Thread t1 = new MyThread();  
            Thread t2 = new MyThread();  
            Thread t3 = new MyThread();  
            // 将线程放入池中进行执行  
            pool.execute(t1);  
            // 使用延迟执行风格的方法  
            pool.schedule(t2, 1000, TimeUnit.MILLISECONDS);  
            pool.schedule(t3, 10, TimeUnit.MILLISECONDS);  
      
            // 关闭线程池  
            pool.shutdown();  
    ExecutorService:是一个接口,继承了Executor:
    Executor:而Executor亦是一个接口,该接口只包含了一个方法:
    void execute(Runnable command);


    newFixedThreadPool()

    创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程

     
  • 相关阅读:
    java 基础 01 变量和注释、数据类型
    js虚拟数字小键盘
    好看的table样式
    Java8的lambda表达式和Stream API
    设计模式-模板
    【转】Git使用教程之基础篇
    Linux安装redis和部署
    【原】DjianGo Windows7下的安装
    【转】七牛云加速域名配置
    【原】Solr入门之概念和安装
  • 原文地址:https://www.cnblogs.com/huojg-21442/p/7308515.html
Copyright © 2011-2022 走看看