多线程读取文件File
生活随笔
收集整理的這篇文章主要介紹了
多线程读取文件File
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Java代碼 ? import?java.io.*;?? class?DownThread?extends?Thread?{?? ????//定義字節(jié)數(shù)組(取水的竹筒)的長(zhǎng)度?? ????private?final?int?BUFF_LEN?=?32;?? ????//定義讀取的起始點(diǎn)?? ????private?long?start;?? ????//定義讀取的結(jié)束點(diǎn)?? ????private?long?end;?? ????//讀取文件對(duì)應(yīng)的輸入流?? ????private?InputStream?is;?? ????//將讀取到的字節(jié)輸出到raf中?? ????private?RandomAccessFile?raf;?? ?? ????//構(gòu)造器,傳入輸入流,輸出流和讀取起始點(diǎn)、結(jié)束點(diǎn)?? ????public?DownThread(long?start,?long?end,?InputStream?is,?RandomAccessFile?raf)?{?? ????????//輸出該線程負(fù)責(zé)讀取的字節(jié)位置?? ????????System.out.println(start?+?"---->"?+?end);?? ????????this.start?=?start;?? ????????this.end?=?end;?? ????????this.is?=?is;?? ????????this.raf?=?raf;?? ????}?? ?? ????public?void?run()?{?? ????????try?{?? ????????????is.skip(start);?? ????????????raf.seek(start);?? ????????????//定義讀取輸入流內(nèi)容的的緩存數(shù)組(竹筒)?? ????????????byte[]?buff?=?new?byte[BUFF_LEN];?? ????????????//本線程負(fù)責(zé)讀取文件的大小?? ????????????long?contentLen?=?end?-?start;?? ????????????//定義最多需要讀取幾次就可以完成本線程的讀取?? ????????????long?times?=?contentLen?/?BUFF_LEN?+?4;?? ????????????//實(shí)際讀取的字節(jié)數(shù)?? ????????????int?hasRead?=?0;?? ????????????for?(int?i?=?0;?i?<?times;?i++)?{?? ????????????????hasRead?=?is.read(buff);?? ????????????????//如果讀取的字節(jié)數(shù)小于0,則退出循環(huán)!?? ????????????????if?(hasRead?<?0)?{?? ????????????????????break;?? ????????????????}?? ????????????????raf.write(buff,?0,?hasRead);?? ????????????}?? ????????}?catch?(Exception?ex)?{?? ????????????ex.printStackTrace();?? ????????}?? ????????//使用finally塊來(lái)關(guān)閉當(dāng)前線程的輸入流、輸出流?? ????????finally?{?? ????????????try?{?? ????????????????if?(is?!=?null)?{?? ????????????????????is.close();?? ????????????????}?? ????????????????if?(raf?!=?null)?{?? ????????????????????raf.close();?? ????????????????}?? ????????????}?catch?(Exception?ex)?{?? ????????????????ex.printStackTrace();?? ????????????}?? ????????}?? ????}?? }?? ?? public?class?MutilDown?{?? ????public?static?void?main(String[]?args)?{?? ????????final?int?DOWN_THREAD_NUM?=?4;?? ????????final?String?OUT_FILE_NAME?=?"d:/copy勇敢的心.rmvb";?? ????????InputStream[]?isArr?=?new?InputStream[DOWN_THREAD_NUM];?? ????????RandomAccessFile[]?outArr?=?new?RandomAccessFile[DOWN_THREAD_NUM];?? ????????try?{?? ?? ????????????isArr[0]?=?new?FileInputStream("d:/勇敢的心.rmvb");?? ????????????long?fileLen?=?getFileLength(new?File("d:/勇敢的心.rmvb"));?? ????????????System.out.println("文件的大小"?+?fileLen);?? ????????????//以輸出文件名創(chuàng)建第一個(gè)RandomAccessFile輸出流?? ????????????outArr[0]?=?new?RandomAccessFile(OUT_FILE_NAME,?"rw");?? ????????????//創(chuàng)建一個(gè)與文件相同大小的空文件?? ????????????for?(int?i?=?0;?i?<?fileLen;?i++)?{?? ????????????????outArr[0].write(0);?? ????????????}?? ????????????//每線程應(yīng)該讀取的字節(jié)數(shù)?? ????????????long?numPerThred?=?fileLen?/?DOWN_THREAD_NUM;?? ????????????//整個(gè)文件整除后剩下的余數(shù)?? ????????????long?left?=?fileLen?%?DOWN_THREAD_NUM;?? ????????????for?(int?i?=?0;?i?<?DOWN_THREAD_NUM;?i++)?{?? ????????????????//為每個(gè)線程打開(kāi)一個(gè)輸入流、一個(gè)RandomAccessFile對(duì)象,?? ????????????????//讓每個(gè)線程分別負(fù)責(zé)讀取文件的不同部分。?? ????????????????if?(i?!=?0)?{?? ?? ????????????????????isArr[i]?=?new?FileInputStream("d:/勇敢的心.rmvb");?? ????????????????????//以指定輸出文件創(chuàng)建多個(gè)RandomAccessFile對(duì)象?? ????????????????????outArr[i]?=?new?RandomAccessFile(OUT_FILE_NAME,?"rw");?? ????????????????}?? ????????????????if?(i?==?DOWN_THREAD_NUM?-?1)?{?? ????????????????????//最后一個(gè)線程讀取指定numPerThred+left個(gè)字節(jié)?? ????????????????????new?DownThread(i?*?numPerThred,?(i?+?1)?*?numPerThred?? ????????????????????????????+?left,?isArr[i],?outArr[i]).start();?? ????????????????}?else?{?? ????????????????????//每個(gè)線程負(fù)責(zé)讀取一定的numPerThred個(gè)字節(jié)?? ????????????????????new?DownThread(i?*?numPerThred,?(i?+?1)?*?numPerThred,?? ????????????????????????????isArr[i],?outArr[i]).start();?? ????????????????}?? ????????????}?? ????????}?catch?(Exception?ex)?{?? ????????????ex.printStackTrace();?? ????????}?? ????}?? ?? ????public?static?long?getFileLength(File?file)?{?? ????????long?length?=?0;?? ????????//獲取文件的長(zhǎng)度?? ????????long?size?=?file.length();?? ????????length?=?size;?? ????????return?length;?? ????}?? }?
總結(jié)
以上是生活随笔為你收集整理的多线程读取文件File的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C# TreeNode的使用方法
- 下一篇: 事件委托 EventHandler 。