`
jamour
  • 浏览: 24621 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

[ J2SE ] 分线程拷贝

阅读更多

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;

 
public class FileCopyThread implements Runnable {
 
 private long head;

 private long end;

 private String fileSourse;

 private String fileTarget;

 public String getFileSourse() {
  return fileSourse;
 }

 public void setFileSourse(String fileSourse) {
  this.fileSourse = fileSourse;
 }

 public String getFileTarget() {
  return fileTarget;
 }

 public void setFileTarget(String fileTarget) {
  this.fileTarget = fileTarget;
 }

 public FileCopyThread(long head, long end) {
  super();
  // TODO Auto-generated constructor stub
  this.head = head;
  this.end = end;
 }

 public void run() {
  try {
   RandomAccessFile rin = new RandomAccessFile(fileSourse, "r");
   RandomAccessFile rout = new RandomAccessFile(fileTarget, "rw");
   
   rin.seek(head);
   rout.seek(head);
   
   byte[] buffer = new byte[1024];
   int length = 0;
   
   while (end - rin.getFilePointer() >= 1024) {
    rin.read(buffer);
    rout.write(buffer);
   }
   
   length = (int) (end - rin.getFilePointer());
   
   rin.readFully(buffer, 0, length);
   rout.write(buffer, 0, length);
   
   rout.close();
   rin.close();
   
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  // 读入键盘输入
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  // 文件来源
  String fileCopyFrom;
  // 文件目标
  String fileCopyTo;
  try {
   System.out.println("要复制的文件:");
   fileCopyFrom = br.readLine();
   System.out.println("文件复制到:");
   fileCopyTo = br.readLine();
   // 创建一个来源 File 实例
   File fileIn = new File(fileCopyFrom);
   // 创建 RandomAccessFile 目标实例
   RandomAccessFile fileOut = new RandomAccessFile(fileCopyTo, "rw");
   // 定义文件长度
   long length = fileIn.length();
   fileOut.setLength(length);

   System.out.println("切分线程数:");
   int num = Integer.parseInt(br.readLine());
   // 创建对象 实例
   FileCopyThread[] copy = new FileCopyThread[num];
   // 创建线程 实例
   Thread[] thread = new Thread[num];
   // h 头;e 尾;block 块数(k)
   long h = 0;
   long e = 0;
   long block = length / 1024;
   
   if(block<=1)
    num=1;
   
   for (int i = 0; i < num; i++) {
    // 定义 每次转移的长度
    h = i * 1024*(block / num);
    e = (i + 1) * 1024*(block/ num);
    if (i == (num - 1))
     e = length;
    // 创建新 FileCopyThread实例 (h, e)
    copy[i] = new FileCopyThread(h, e);
    thread[i] = new Thread(copy[i]);
    // 设置新实例的文件来源
    copy[i].setFileSourse(fileCopyFrom);
    // 设置新实例的文件目标
    copy[i].setFileTarget(fileCopyTo);
    // 线程启动
    thread[i].start();
    
   }
   fileOut.close();
   System.out.println("转移完成。");
   
  } catch (IOException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
 }

}

分享到:
评论

相关推荐

    JavaNIO与IO的区别和比较.pdf

    Java NIO(New Input/Output)是Java标准库在J2SE 1.4及更高版本中引入的一个重要更新,它的出现是为了改进传统的IO模型,提高I/O操作的效率和并发性。NIO的主要特点包括非阻塞I/O、字符转换、缓冲以及通道等。 1. ...

    java初学者必看

    7.4.3 拷贝构造方法 7.4.4 重载构造方法 7.4.5 调用构造方法 7.4.6 初始化块 7.5 包 7.5.1 包的概念 7.5.2 类的导入 7.5.3 包名与目录 7.5.4 静态导入 7.5.5 Java包介绍 7.6 类设计技巧 7.7 实例:完善...

    Java NIO - The NIO Architecture

    随着J2SE 1.4的发布,Java引入了一个全新的I/O架构——NIO(New I/O),旨在解决传统I/O模型中的一些问题并提供更高效的处理方式。本篇文章将深入探讨NIO的核心概念、内部结构以及它如何改变了我们处理文件和网络...

    JProfiler配置(WAS/Linux/tomcat/windows)

    JProfiler是一款强大的Java剖析工具,它集成了CPU、线程和内存的分析,适用于J2SE和J2EE应用程序。通过其直观的GUI界面,开发者能够定位性能瓶颈,检测内存泄漏,解决线程问题,以及进行heap分析。JProfiler还提供了...

    java面试题库大全

    - **对象创建与内存分配**:浅拷贝与深拷贝,对象的引用与可达性分析。 - **垃圾收集机制**:GC的基本原理,分代收集,Stop-the-world事件,新生代和老年代的垃圾回收算法。 - **内存泄漏与内存溢出**:识别和...

    jprofiler windows 使用方法介绍

    JProfiler是一款强大的Java性能分析工具,它可以帮助开发者深入洞察J2SE和J2EE应用程序的CPU使用、线程活动以及内存管理情况。本文将详细介绍如何在Windows环境下安装和使用JProfiler,包括本地监控和远程监控Tomcat...

    CORE JAVA总结_沈红喜

    - **特点**:可变字符串,适用于大量字符串操作的情况,非线程安全,性能优于 `StringBuffer`。 - **API 方法**: - `toString()` - `reverse()` - `append(Object obj)` - `insert(int offset, Object obj)` -...

    新版Android开发教程.rar

    � Google 提供了一套 Java 核心包 (J2SE 5,J2SE 6) 的有限子集,尚不承诺遵守 Java 任何 Java 规范 , 可能会造 成J ava 阵营的进一步分裂。 � 现有应用完善度不太够,需要的开发工作量较大。--------------------...

Global site tag (gtag.js) - Google Analytics