zoukankan      html  css  js  c++  java
  • Java-->多线程复制(文件指针)

    --> 这里用到两种方法...其实也不算两种,就一点点不一样而已...

    ---> Test 测试类

    package com.dragon.java.multithreadcopy;
    
    import java.io.File;
    import java.util.Scanner;
    
    /*
     * 利用多线程复制文件1
     */
    public class Test {
        public static void main(String[] args) {
            @SuppressWarnings("resource")
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入文件路径:");
            File srcFile = new File(scanner.next());
            System.out.println("请输入线程数:");
            int n = scanner.nextInt();
            if (!srcFile.exists()) {
                System.out.println("该文件不存在!");
            }
    
            File desFile = new File(srcFile.getParent(), "new" + srcFile.getName());
    
         // 从线程数得到每个线程要复制的数据大小
    long partLenghth = srcFile.length() / n + 1; for (int i = 1; i < n + 1; i++) {
           // 每次复制的开始和结束位置
    new MyThread(srcFile, desFile, partLenghth * (i - 1), partLenghth * i).start(); } } }

    --> MyThread类即线程实现类

    package com.dragon.java.multithreadcopy;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    
    public class MyThread extends Thread {
        private File srcFile;
        private File desFile;
        private long start;
        private long end;
    
        MyThread() {
            super();
        }
    
       // 构造方法传入源文件、目标文件、本次开始位置以及结束位置 MyThread(File srcFile, File desFile,
    long start, long end) { super(); this.srcFile = srcFile; this.desFile = desFile; this.start = start; this.end = end; } @Override public void run() { RandomAccessFile rafSrc = null; RandomAccessFile rafDes = null; try { rafSrc = new RandomAccessFile(srcFile, "r"); rafDes = new RandomAccessFile(desFile, "rw");
           // 将文件指针移动到将要开始复制的位置 rafSrc.seek(start); rafDes.seek(start);
    int len = -1; byte[] buffer = new byte[64]; while ((len = rafSrc.read(buffer)) != -1) { rafDes.write(buffer, 0, len);
              // 当读取到的位置大于或等于要结束的位置时跳出循环 if (rafSrc.getFilePointer() >= end) { break; } } } catch (IOException e) { System.out.println(e); } } }

    --> -----------------------------------------------------------------------邪恶的分割线----------------------------------------------------------------------------

    --> Test测试

    import java.util.Scanner;
    
    /*
     * 利用多线程复制文件利用多线程复制文件2
     */
    public class Test {
        public static void main(String[] args) {
            @SuppressWarnings("resource")
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入文件路径:");
            File srcFile = new File(scanner.next());
            System.out.println("请输入线程个数:");
            int n = scanner.nextInt();
            if (!srcFile.exists()) {
                System.out.println("该文件不存在!");
            }
    
            File desFile = new File(srcFile.getParent(), "new" + srcFile.getName());
    long partLenghth = srcFile.length() / n + 1; for (int i = 1; i < n + 1; i++) {
           
    // 每次传入单线程复制的长度 new MyThread(srcFile, desFile, partLenghth, MyThread.getPointer()) .start(); } } }

    --> MyThread线程实现类

     1 package com.dragon.java.newthreadcopy;
     2 
     3 import java.io.File;
     4 import java.io.IOException;
     5 import java.io.RandomAccessFile;
     6 
     7 public class MyThread extends Thread {
     8     private File srcFile;
     9     private File desFile;
    10     private long partLength;
    11     private static long pointer = 0;
    12 
    13     MyThread() {
    14         super();
    15     }
    16 
    17     MyThread(File srcFile, File desFile, long partLength, long pointer) {
    18         super();
    19         this.srcFile = srcFile;
    20         this.desFile = desFile;
    21         this.partLength = partLength;
    22         MyThread.pointer = pointer;
    23     }
    24 
    25     @Override
    26     public void run() {
    27         RandomAccessFile rafSrc = null;
    28         RandomAccessFile rafDes = null;
    29         try {
    30             rafSrc = new RandomAccessFile(srcFile, "r");
    31             rafDes = new RandomAccessFile(desFile, "rw");
    32 
    33             rafSrc.seek(pointer);
    34             rafDes.seek(pointer);
    35 
             // 一次性复制完整的一部分长度 36 byte[] buffer = new byte[(int) partLength]; 37 int len = rafSrc.read(buffer); 38 rafDes.write(buffer, 0, len); 39 pointer = rafSrc.getFilePointer(); 40 } catch (IOException e) { 41 System.out.println(e); 42 } 43 } 44 45 public static long getPointer() { 46 return pointer; 47 } 48 }

    --> 感觉第二种也完全是多余的啊,就是一种方法...

  • 相关阅读:
    Javascript typeof 用法
    查询指定范围内数据记录(适用于sqlserver2005以上)
    提示信息并跳转的目标URL
    教你如何删除MSN群
    通过sqlserver2005 获取客户端信息
    分层遍历数据
    重写render,利用ClientScript,在客户端注册select,回发到服务器,触发服务器端的行选择事件。
    ASP.NET下的TreeView控件的使用(生成树与统计所有子节点数量)
    后台取浏览器中cookie的用法
    jdk开发环境的搭建
  • 原文地址:https://www.cnblogs.com/xmcx1995/p/5785177.html
Copyright © 2011-2022 走看看