多線程讀取文件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. ????}??
  115. }?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451454.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451454.shtml
英文地址,請注明出處:http://en.pswp.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…