Java多线程复制文件(转)

package  mastercn;
import  java.io.File;
import  java.io.FileInputStream;
import  java.io.InputStream;
import  java.io.RandomAccessFile;


public   class  CopyFile  implements  Runnable {
    
// 来源文件
     private  String sourceFileName;
    
// 目标文件
     private  String targetFileName;
    
// 分块总数
     private   int  blockCount;
    
// 开始COPY的块序号
     private   int  blockNo;
    
// 缓存大小
     private   int  maxBuffSize = 1024 * 1024 ;
    
/**
     * 将sourceFileName文件分blockCount块后的第blockNo块复制至sourceFileName
     * 
@param  sourceFileName 来源文件全名
     * 
@param  targetFileName 目标文件全名
     * 
@param  blockCount 文件分块COPY数
     * 
@param  blockNo 开始COPY的块序号
     
*/
    
public  CopyFile(String sourceFileName,String targetFileName, int  blockCount, int  blockNo)
    {
        
this .sourceFileName = sourceFileName;
        
this .targetFileName = targetFileName;
        
this .blockCount = blockCount;
        
this .blockNo = blockNo;
    }
    
public   void  run() {
        
// 得到来源文件
        File file = new  File(sourceFileName);
        
// 得到来源文件的大小
         long  size = file.length();
        
// 根据文件大小及分块总数算出单个块的大小
         long  blockLenth = size / blockCount;
        
// 算出当前开始COPY的位置
         long  startPosition = blockLenth * blockNo;
        
// 实例化缓存
         byte [] buff = new   byte [maxBuffSize];
        
try {
            
// 从源文件得到输入流
            InputStream inputStream = new  FileInputStream(sourceFileName);
            
// 得到目标文件的随机访问对象
            RandomAccessFile raf = new  RandomAccessFile(targetFileName, " rw " );
            
// 将目标文件的指针偏移至开始位置
            raf.seek(startPosition);
            
// 当前读取的字节数
             int  curRedLength;
            
// 累计读取字节数的和
             int  totalRedLength = 0 ;
            
// 将来源文件的指针偏移至开始位置
            inputStream.skip(startPosition);
            
// 依次分块读取文件
             while ((curRedLength = inputStream.read(buff)) > 0   &&  totalRedLength < blockLenth)
            {
                
// 将缓存中的字节写入文件?目标文件中
                raf.write(buff,  0 , curRedLength);
                
// 累计读取的字节数
                totalRedLength += curRedLength;
            }
            
// 关闭相关资源
            raf.close();
            inputStream.close();
        }
catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }

}

package mastercn;

public class Test {

    
/**
     * 
@param args
     
*/
    
//来源文件
    private static String sourceFile;
    
//目标文件
    private static String targetFile;
    
//分块数
    private static int blockCount;
    
    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
        
//
        sourceFile=args[0];
        targetFile
=args[1];
        blockCount
=Integer.parseInt(args[2]);
        
//记录开始时间
        long beginTime=System.currentTimeMillis();
        
//依次分块进行文件COPY
        for(int i=0;i<blockCount;i++)
        {
            
//实例化文件复制对象
            CopyFile copyFile=new CopyFile(sourceFile,targetFile,blockCount,i);
            
//实例化线程
            Thread thread=new Thread(copyFile);
            
//开始线程
            thread.start();
            
try
            {
                
//加入线程
                thread.join();
            }
            
catch (Exception e) {
                
// TODO: handle exception
                e.printStackTrace();
            }
        }
        
//计算耗时
        long endTime=System.currentTimeMillis();
        
//输出耗时
        System.out.println("共用时:"+(endTime-beginTime)+"ms");

    }
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个使用Java多线程实现文件复制的示例程序: ```java import java.io.*; public class FileCopyThread extends Thread { private File sourceFile; private File targetFile; public FileCopyThread(File sourceFile, File targetFile) { this.sourceFile = sourceFile; this.targetFile = targetFile; } public void run() { try { FileInputStream in = new FileInputStream(sourceFile); FileOutputStream out = new FileOutputStream(targetFile); byte[] buffer = new byte[4096]; // 缓冲区大小为4KB int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } in.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { File source = new File("source.txt"); File target = new File("target.txt"); int threadCount = 4; // 创建4个线程 long fileSize = source.length(); long blockSize = fileSize / threadCount; for (int i = 0; i < threadCount; i++) { long start = i * blockSize; long end = (i == threadCount - 1) ? fileSize : (i + 1) * blockSize; new FileCopyThread(source, target, start, end).start(); } } } ``` 该程序使用了多线程复制文件。首先,将要复制文件分成若干个块,每个块由一个线程处理。在 `FileCopyThread` 类的构造函数中,需要传入源文件和目标文件,以及该线程需要复制文件块的起始和结束位置。在 `run()` 方法中,使用 `FileInputStream` 和 `FileOutputStream` 分别读取和写入文件,每次读取缓冲区大小的数据,并使用 `while` 循环重复读取和写入,直到文件复制完成。 在 `main()` 方法中,首先指定源文件和目标文件,然后指定要创建的线程数。接着,计算每个线程需要复制文件块的起始和结束位置,并创建 `FileCopyThread` 对象,并启动该线程。 需要注意的是,该示例程序没有考虑多线程并发读写文件的问题,可能会产生竞争条件和文件损坏等问题。在实际应用中,需要使用线程同步机制来保证线程安全。同时,该程序还没有处理文件不存在等异常情况,也需要根据实际需求进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值