多线程读取文件File

Java代码  收藏代码
  1. import java.io.*;  
  2. class DownThread extends Thread {  
  3.     //定义字节数组(取水的竹筒)的长度  
  4.     private final int BUFF_LEN = 32;  
  5.     //定义读取的起始点  
  6.     private long start;  
  7.     //定义读取的结束点  
  8.     private long end;  
  9.     //读取文件对应的输入流  
  10.     private InputStream is;  
  11.     //将读取到的字节输出到raf中  
  12.     private RandomAccessFile raf;  
  13.   
  14.     //构造器,传入输入流,输出流和读取起始点、结束点  
  15.     public DownThread(long start, long end, InputStream is, RandomAccessFile raf) {  
  16.         //输出该线程负责读取的字节位置  
  17.         System.out.println(start + "---->" + end);  
  18.         this.start = start;  
  19.         this.end = end;  
  20.         this.is = is;  
  21.         this.raf = raf;  
  22.     }  
  23.   
  24.     public void run() {  
  25.         try {  
  26.             is.skip(start);  
  27.             raf.seek(start);  
  28.             //定义读取输入流内容的的缓存数组(竹筒)  
  29.             byte[] buff = new byte[BUFF_LEN];  
  30.             //本线程负责读取文件的大小  
  31.             long contentLen = end - start;  
  32.             //定义最多需要读取几次就可以完成本线程的读取  
  33.             long times = contentLen / BUFF_LEN + 4;  
  34.             //实际读取的字节数  
  35.             int hasRead = 0;  
  36.             for (int i = 0; i < times; i++) {  
  37.                 hasRead = is.read(buff);  
  38.                 //如果读取的字节数小于0,则退出循环!  
  39.                 if (hasRead < 0) {  
  40.                     break;  
  41.                 }  
  42.                 raf.write(buff, 0, hasRead);  
  43.             }  
  44.         } catch (Exception ex) {  
  45.             ex.printStackTrace();  
  46.         }  
  47.         //使用finally块来关闭当前线程的输入流、输出流  
  48.         finally {  
  49.             try {  
  50.                 if (is != null) {  
  51.                     is.close();  
  52.                 }  
  53.                 if (raf != null) {  
  54.                     raf.close();  
  55.                 }  
  56.             } catch (Exception ex) {  
  57.                 ex.printStackTrace();  
  58.             }  
  59.         }  
  60.     }  
  61. }  
  62.   
  63. public class MutilDown {  
  64.     public static void main(String[] args) {  
  65.         final int DOWN_THREAD_NUM = 4;  
  66.         final String OUT_FILE_NAME = "d:/copy勇敢的心.rmvb";  
  67.         InputStream[] isArr = new InputStream[DOWN_THREAD_NUM];  
  68.         RandomAccessFile[] outArr = new RandomAccessFile[DOWN_THREAD_NUM];  
  69.         try {  
  70.   
  71.             isArr[0] = new FileInputStream("d:/勇敢的心.rmvb");  
  72.             long fileLen = getFileLength(new File("d:/勇敢的心.rmvb"));  
  73.             System.out.println("文件的大小" + fileLen);  
  74.             //以输出文件名创建第一个RandomAccessFile输出流  
  75.             outArr[0] = new RandomAccessFile(OUT_FILE_NAME, "rw");  
  76.             //创建一个与文件相同大小的空文件  
  77.             for (int i = 0; i < fileLen; i++) {  
  78.                 outArr[0].write(0);  
  79.             }  
  80.             //每线程应该读取的字节数  
  81.             long numPerThred = fileLen / DOWN_THREAD_NUM;  
  82.             //整个文件整除后剩下的余数  
  83.             long left = fileLen % DOWN_THREAD_NUM;  
  84.             for (int i = 0; i < DOWN_THREAD_NUM; i++) {  
  85.                 //为每个线程打开一个输入流、一个RandomAccessFile对象,  
  86.                 //让每个线程分别负责读取文件的不同部分。  
  87.                 if (i != 0) {  
  88.   
  89.                     isArr[i] = new FileInputStream("d:/勇敢的心.rmvb");  
  90.                     //以指定输出文件创建多个RandomAccessFile对象  
  91.                     outArr[i] = new RandomAccessFile(OUT_FILE_NAME, "rw");  
  92.                 }  
  93.                 if (i == DOWN_THREAD_NUM - 1) {  
  94.                     //最后一个线程读取指定numPerThred+left个字节  
  95.                     new DownThread(i * numPerThred, (i + 1) * numPerThred  
  96.                             + left, isArr[i], outArr[i]).start();  
  97.                 } else {  
  98.                     //每个线程负责读取一定的numPerThred个字节  
  99.                     new DownThread(i * numPerThred, (i + 1) * numPerThred,  
  100.                             isArr[i], outArr[i]).start();  
  101.                 }  
  102.             }  
  103.         } catch (Exception ex) {  
  104.             ex.printStackTrace();  
  105.         }  
  106.     }  
  107.   
  108.     public static long getFileLength(File file) {  
  109.         long length = 0;  
  110.         //获取文件的长度  
  111.         long size = file.length();  
  112.         length = size;  
  113.         return length;  
  114.     }  


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode-----翻转二叉树

题目——翻转二叉树 翻转一棵二叉树。 示例&#xff1a; 输入&#xff1a; 4/ \2 7/ \ / \ 1 3 6 9 输出&#xff1a; 4/ \7 2/ \ / \ 9 6 3 1 备注: 这个问题是受到 Max Howell 的 原问题 启发的 &#xff1a; 谷歌&#xff1a;我们90&#xff05;的工…

JAVA中字符串比较equals()和equalsIgnoreCase()的区别

1、使用equals( )方法比较两个字符串是否相等。它具有如下的一般形式&#xff1a; boolean equals(Object str) 这里str是一个用来与调用字符串&#xff08;String&#xff09;对象做比较的字符串&#xff08;String&#xff09;对象。如果两个字符串具有相同的字符和长度&…

Spring Boot 是什么,有什么用。

见&#xff1a;http://www.csdn.net/article/a/2016-05-12/15838098 maven/Java/web/bootstrap/dataTable/app开发QQ群&#xff1a;566862629。希望更多人一起帮助我学习。 首先&#xff0c;我们来看一下spring boot是什么&#xff0c;它帮助我们解决了哪些问题&#xff1a; …

纯html5+css3能写出什么惊人效果?

在搞清楚这个问题之前,我们得先弄清楚H5和css3有哪些惊人的特性首先我们来看下H5的新特性,canvas标签,多媒体标签(audio/video) 离线存储, 新的表单元素, 新的表单控件 地理定位等等,要说道惊人效果,其中canvas audio video 还有地理定位等就可以够玩一年 但题目中的一个纯字,一…

FPGA数据传输模块设计

摘要 FPGA适合于大量数据处理的应用&#xff0c;广泛应用于嵌入式系统。本文设计的FPGA模块需要对GPS、便携打印机和串口数据进行处理&#xff0c;将详细介绍如何设计FPGA和不同外设之间的数据传输。同时&#xff0c;在RTL编码中&#xff0c;编写使综合与布局布线效果更佳的代码…

java获取当前时间戳的方法

获取当前时间戳 //方法 一 System.currentTimeMillis(); //方法 二 Calendar.getInstance().getTimeInMillis(); //方法 三 new Date().getTime(); 获取当前时间 SimpleDateFormat df new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 String date df.…

解决Linux 忘记root 密码的办法

今天突然遇到一个问题&#xff0c;那别人的 linux 系统发现root 密码竟然不知道&#xff0c;这就尴尬了。经过一番百度&#xff0c;记录下 如何修改root 密码 1&#xff1a;开机linxu 按E 键 2&#xff1a;继续按E 键 3:选择 kernel..... 按E 4&#xff1a;在rhgb quiet 后面加…

tomcat的class加载的优先顺序

来源&#xff1a;https://bbs.csdn.net/topics/80459833Tomcat的class加载的优先顺序一览 最先是$JAVA_HOME/jre/lib/ext/下的jar文件。环境变量CLASSPATH中的jar和class文件。\$CATALINA_HOME/common/classes下的class文件。\$CATALINA_HOME/commons/endorsed下的jar文件。\$C…

简单理解Hadoop(Hadoop是什么、如何工作)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、Hadoop主要的任务部署分为3个部分&#xff0c;分别是&#xff1a;Client机器&#xff0c;主节点和从节点。主节点主要负责Hadoop两个…

JPA @Id 和 @GeneratedValue 注解详解

Id&#xff1a; Id 标注用于声明一个实体类的属性映射为数据库的主键列。该属性通常置于属性声明语句之前&#xff0c;可与声明语句同行&#xff0c;也可写在单独行上。 Id标注也可置于属性的getter方法之前。 GeneratedValue&#xff1a; GeneratedValue 用于标注主键的生…

Factorials 阶乘

Description N的阶乘写作N!表示小于等于N的所有正整数的乘积。阶乘会很快的变大&#xff0c;如13!就必须用32位整数类型来存储&#xff0c;70&#xff01;即使用浮点数也存不下了。你的任务是找到阶乘最后面的非零位。举个例子,5!1*2*3*4*5120所以5!的最后面的非零位是2&#x…

硬件模块设计思想

硬件模块设计">模块设计,顾名思义就是将各个不同的功能做成独立的模块。然后将各个模块组合成不同的产品。 对于一个公司硬件模块化设计,从设计之初,调试,到样机及产品生产的过程应该是这样&#xff1a; 1.     了解产品需求 2.     根据需求,选择合适的处理…

java中的lastIndexOf( )函数是什么意思

int x a.lastIndexOf(b),表示b字符串在a字符串中最后出现的位置。如 a "abcdabcd";b"d";那么x的值为7.

2 分钟读懂大数据框架 Hadoop 和 Spark 的异同

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 谈到大数据&#xff0c;相信大家对Hadoop和Apache Spark这两个名字并不陌生。但我们往往对它们的理解只是提留在字面上&#xff0c;并没有…

操作系统文件编程知识

文件的创建和读写 当我们需要打开一个文件进行读写操作的时候&#xff0c;我们可以使用系统调用函数open。使用完成以后我们调用另外一个close函数进行关闭操作。 该函数使用的头文件如下&#xff1a; #include <fcntl.h> #include <unistd.h> #include <sys/ty…

论述HTML5平台的若干重要特性

开发者已凭借网页技术制作出创收丰厚的游戏作品许多年&#xff1a;《部落战争》凭借静态网页页面大获成功&#xff0c;《Farmville》凭借Flash开拓出新的疆域。但如今越来越多人觉得&#xff0c;未来HTML5将变成游戏的主要平台。为什么HTML5如此颇具趣味&#xff0c;它是否真的…

多GPU使用详解

目录&#xff1a; 介绍 记录设备状态 手动分配状态 允许GPU内存增长 在多GPU系统是使用单个GPU 使用多个 GPU 一、介绍 在一个典型的系统中&#xff0c;有多个计算设备。在 TensorFlow 中支持的设备类型包括 CPU 和 GPU。他们用字符串来表达&#xff0c;例如&#xff1a; “/cp…

图片上传的两种方式

总的说图片上传有两种方式&#xff0c;一种是把图片文件写到数据库中&#xff0c;另一种是存到服务器文件目录中。写到数据库中的图片文件需要转换成二进制流的格式&#xff0c;占用数据库空间比较多&#xff0c;适合少量图片的存储&#xff0c;比如说&#xff0c;系统中某些小…

最好理解的: spring ioc原理讲解,强烈推荐!

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 IOC&#xff08;DI&#xff09;&#xff1a;java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成。通常&#xff0c;每个对象在…

微信小程序 - 回到自己位置(map)

演示效果&#xff1a; 图片资源 index.js 1 /** 2 * 回到自己位置&#xff0c;在cover-image上绑定点击事件即可. 3 */ 4 clickcontrol(e) { 5 let mpCtx wx.createMapContext("map"); 6 mpCtx.moveToLocation(); 7 }, 转载于:https://www.cnbl…