多线程读取文件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,一经查实,立即删除!

相关文章

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; …

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 后面加…

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

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

Factorials 阶乘

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

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

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

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

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

如何让tomcat服务器运行在80端口,并且无需输入项目名即可访问项目()

这个问题最开始遇到的时候是半年前,自己买了个服务器玩,但是域名解析的时候出了问题,我查了查资料才知道腾讯云是默认解析到80端口,而且还改不了. 首先是修改tomcat运行端口号,默认是8080,但是我们可以通过修改配置文件更改, 打开conf/server.xml文件找到这个地方,: 将8080改为…

使用图形芯片加速电子自动化设计应用程序

以往EDA应用性能瓶颈主要受两方面因素制约&#xff0c;首先大多数应用都是单线程的&#xff0c;而CPU和GPU架构拥有几十到数千的并行内核&#xff0c;其次是应用程序内存延迟问题。目前EDA应用已经部署到传统的常规处理器上。最重要的是这些应用促使人们设计出并行或向量处理器…

【Linux】Linux中常用操作命令

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 常用指令 ls   显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录&#xff0…

大数据应用时代来袭 SaaS走向没落?

随着大量的信息涌入互联网——90%的互联网是过去两年建立起来的——互联网公司正在想方设法去熟悉并利用大数据来推动他们的业务。正如SaaS和云技术一样完全变革了企业的运作方式一样&#xff0c;大数据应用&#xff08;BDA&#xff09;也同样可以。 BDA是基于网络的应用&#…

Java程序员必知的10个调试技巧

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 在本文中&#xff0c;作者将使用大家常用的的开发工具Eclipse来调试Java应用程序。但这里介绍的调试方法基本都是通用的&#xff0c;也适…

【GPS】GPS的C_GNSS_RF_ELNA_GPIO_NUM_DEFAULT配置,Linux系统中GPIO的设置

GPS的GPIO配置文件 客户需要更改此变量C_GNSS_RF_ELNA_GPIO_NUM_DEFAULT才能覆盖NAVRF驱动程序ELNA设置。   modem_proc/gps/gnss/mgp/me/gen8/src/cgps_ext.c /* Customer needs to change this variable in order to override NAVRF driver ELNA setting */ gnss_ExternalG…

性能测试的重要意义(一)

♦我是一下下面几个方面来理解的&#xff1a; 1.秒的性能对于顾客的意义&#xff1f; 2.性能测试的重要意义 3.什么是软件的性能&#xff1f; 4.软件的性能测试是什么&#xff1f; 5.功能测试和性能测试对比&#xff1f; 6.项目组不同角色眼中的软件性能&#xff1f; 7.性能测试…

ContextLoaderListener介绍

在给新同事培训Spring MVC时&#xff0c;有人问&#xff1a;可以不配置ContextLoaderListener吗 所谓ContextLoaderListener&#xff0c;就是在web部署描述符即web.xml里面经常配置的一个监听器&#xff0c;如下 [html] view plaincopy <listener> <listener-cl…

移动开发(C#、VB.NET)Smobiler开发平台——GifView控件的使用方式

2019独角兽企业重金招聘Python工程师标准>>> 一、 样式一 我们要实现上图中的效果&#xff0c;需要如下的操作&#xff1a; 从工具栏上的“Smobiler Components”拖动一个GifView控件到窗体界面上修改GifView的属性 AutoPlay属性获得和设置是否自动播放Gif…

常用数据结构--线性结构

数据结构是计算机存储、组织数据的方式。常见的数据结构分类方式如下图&#xff1a; 常用的线性结构有&#xff1a;线性表&#xff0c;栈&#xff0c;队列&#xff0c;循环队列&#xff0c;数组。线性表中包括顺序表、链表等&#xff0c;其中&#xff0c;栈和队列只是属于逻辑上…

依赖注入简介(一)

依赖注入(Injecting dependencies)经常听起来会让人感觉到很难以理解&#xff0c;会让大家感觉这是很复杂的编程技术&#xff0c;但是事实上并不是这样&#xff0c;依赖注入非常方便使用&#xff0c;它会让你的程序非常便于理解&#xff0c;同时也更容易进行测试。 依赖注入的…

Jmeter笔记(Ⅱ)使用Jmeter实现轻量级的接口自动化测试

接口测试虽然作为版本的一环&#xff0c;但是也是有一套完整的体系&#xff0c;有接口的功能测试、性能测试、安全测试&#xff1b;同时&#xff0c;由于接口的特性&#xff0c;接口的自动化低成本高收益的&#xff0c;使用一些开源工具或一些轻量级的方法&#xff0c;在测试用…