生活随笔
收集整理的這篇文章主要介紹了
Java io流实现文件分割
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
網(wǎng)絡(luò)上傳文件的時候,當一個文件很大時,就需要將文件分割成幾個文件,以便于網(wǎng)絡(luò)傳輸。用java來實現(xiàn)這個功能,思路如下:利用io流讀取文件,然后再將文件字節(jié)分成對應(yīng)的字節(jié),再寫入文件。為了加快讀取文件效率,每讀取每一塊數(shù)據(jù),創(chuàng)建一個線程;如果文件有100M,每次分割1M,那么按照如上的代碼就會創(chuàng)建100個線程,可以加入線程池解決無論多少個線程,每次只執(zhí)行指定個數(shù)的線程數(shù)
代碼實現(xiàn)如下:
package com
.hzl
.java
.File
;import java
.io
.File
;
import java
.io
.FileOutputStream
;
import java
.io
.RandomAccessFile
;
import java
.util
.UUID
;
import java
.util
.concurrent
.ExecutorService
;
import java
.util
.concurrent
.Executors
;public class Main4 {public static void main(String
[] args
) {String basefile
= "d:data/";new File(basefile
).mkdir();String filename
= "d:readme.txt";String suf
= filename
.substring(filename
.lastIndexOf("."));long length
= (new File(filename
)).length();int sonfile
= 10;int times
= (int) Math
.ceil(length
/ (float) sonfile
);ExecutorService threadPool
= Executors
.newFixedThreadPool(times
);for (int i
= 0; i
< times
; i
++) {final int j
= i
;String newfilename
= UUID
.randomUUID().toString();threadPool
.execute(() -> {try (RandomAccessFile randomAccessFile
= new RandomAccessFile(filename
, "rw");FileOutputStream fileOutputStream
= new FileOutputStream(basefile
+ newfilename
+ suf
);) {int pos
= sonfile
* j
;randomAccessFile
.seek(pos
);byte[] buf
= new byte[sonfile
];int size
= randomAccessFile
.read(buf
);fileOutputStream
.write(buf
, 0, size
);} catch (Exception e
) {e
.printStackTrace();}});}System
.out
.println("文件分割完成");threadPool
.shutdown();}}
運行結(jié)果如下:
總結(jié)
以上是生活随笔為你收集整理的Java io流实现文件分割的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。