java文件拆分合并,基于Netty的文件斷點(diǎn)續(xù)傳晚唇,分片傳輸

公司無聊想做一個(gè)文件傳輸巫财,斷點(diǎn)續(xù)傳功能,然后呢哩陕,就寫了一個(gè)demo版平项,
我不會(huì)講解代碼赫舒,但是我會(huì)寫代碼

https://gitee.com/heixiaomas_admin/file_transfer_system.git
基于netty的文件拆分,簡(jiǎn)易文字聊天闽瓢,分片傳輸接癌,文件合并,重新連接鸳粉,續(xù)發(fā)分片demo
序列化采用jboss的marshalling-serial

代碼運(yùn)行效果如圖(聊天過程自己和自己發(fā)文件)

image.png
image.png


import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.*;

public class Main {

    private static String path="E:/test/";
    private static String filename="個(gè)人簡(jiǎn)歷.docx";
    private static String newfilename="個(gè)人簡(jiǎn)歷_new.docx";
    //拆分大小,請(qǐng)保證拆分大小保證大于1 kB扔涧,大小自己控制
    private static final int count = 1;


    public static void main(String[] args) throws Exception {
        //保存拆分
        saveFile();
        //進(jìn)行合并
        getMerge();
    }

    /**
     * 創(chuàng)建指定大小的文件
     *
     * @param size
     */
    public static void createBigFile(long size) {
        Path filePath = Paths.get("E:\\test\\個(gè)人簡(jiǎn)歷_new.docx");

        try {
            if (!Files.exists(filePath)) {
                Files.createFile(filePath);
            }
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        ByteBuffer buffer = ByteBuffer.allocate(1);
        try (FileChannel fileChannel = FileChannel.open(filePath, StandardOpenOption.CREATE, StandardOpenOption.WRITE)) {
            fileChannel.position(size-1);
            fileChannel.write(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


    /**
     * 拆分邏輯
     *
     * @throws Exception
     */
    public static void saveFile() throws Exception {
        RandomAccessFile randomAccessFile = new RandomAccessFile(path+filename, "r");
        FileChannel channel = randomAccessFile.getChannel();
        long size = channel.size();
        long l = size / 1024;
        if (l > count) {
            System.out.println(l);
            //計(jì)算前部整體
            int i;
            for (i = 0; i < l / count; i++) {
                byte[] files = getFiles(randomAccessFile, randomAccessFile.getFilePointer(), count*1024);
                FileOutputStream out = new FileOutputStream(path+filename+"." + (i + 1) + ".tmp");
                out.write(files);
                out.flush();
                out.close();
            }
            //計(jì)算尾巴
            long l1 = size - ((size / (count*1024)) * count*1024);
            System.out.println(l1);
            if (l1 > 0) {
                byte[] files = getFiles(randomAccessFile, randomAccessFile.getFilePointer(), (int) l1);
                FileOutputStream out = new FileOutputStream(path+filename+"." + (i + 1) + ".tmp");
                out.write(files);
                out.flush();
                out.close();
            }

            FileOutputStream out = new FileOutputStream(path+"拆分說明.tmp");
            //拆分文件名,拆分份數(shù)届谈,拆分大小枯夜,最后一次拆分大小,被拆分文件總大小
            out.write((filename+"," + (i + 1) + "," + count + "," + l1 + "," + size).getBytes());
            out.flush();
            out.close();

            randomAccessFile.close();
        }

    }

    /**
     * 拆分文件
     *
     * @param file
     * @param seek
     * @param count
     * @return
     * @throws Exception
     */
    public static byte[] getFiles(RandomAccessFile file, long seek, int count) throws Exception {
        file.seek(seek);
        byte[] bytes = new byte[count];
        file.read(bytes);
        return bytes;
    }


    /**
     * 合并
     */
    public static void getMerge() throws Exception {
        FileInputStream inputStream = new FileInputStream(path+"拆分說明.tmp");
        FileChannel channel = inputStream.getChannel();
        byte[] bytes = new byte[(int) channel.size()];
        inputStream.read(bytes);
        String string = new String(bytes);
        String[] split = string.trim().split(",");
        //創(chuàng)建一個(gè)空的文件
        createBigFile(Long.parseLong(split[split.length - 1]));

        RandomAccessFile file = new RandomAccessFile(path+newfilename, "rw");

        for (int i = 0; i < Integer.parseInt(split[1]); i++) {
            System.out.println("拆分保存路徑----》"+path + split[0] + "." + (i + 1) + ".tmp");
            FileInputStream fin = new FileInputStream(path + split[0] + "." + (i + 1) + ".tmp");
            byte[] byt;
            //合并尾部文件
            if (i == Integer.parseInt(split[1]) - 1) {
                byt = new byte[Integer.parseInt(split[3])];
            } else {
                byt = new byte[Integer.parseInt(split[2]) * 1024];
            }
            fin.read(byt);
            file.seek(file.getFilePointer());
            file.write(byt);

        }
        file.close();


    }


}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末艰山,一起剝皮案震驚了整個(gè)濱河市湖雹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌曙搬,老刑警劉巖摔吏,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異纵装,居然都是意外死亡征讲,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門橡娄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诗箍,“玉大人,你說我怎么就攤上這事挽唉÷俗妫” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵瓶籽,是天一觀的道長(zhǎng)匠童。 經(jīng)常有香客問我,道長(zhǎng)塑顺,這世上最難降的妖魔是什么汤求? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮茬暇,結(jié)果婚禮上首昔,老公的妹妹穿的比我還像新娘。我一直安慰自己糙俗,他們只是感情好勒奇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巧骚,像睡著了一般赊颠。 火紅的嫁衣襯著肌膚如雪格二。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天竣蹦,我揣著相機(jī)與錄音顶猜,去河邊找鬼。 笑死痘括,一個(gè)胖子當(dāng)著我的面吹牛长窄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纲菌,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼挠日,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了翰舌?” 一聲冷哼從身側(cè)響起嚣潜,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎椅贱,沒想到半個(gè)月后懂算,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庇麦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年计技,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片山橄。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡酸役,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出驾胆,到底是詐尸還是另有隱情,我是刑警寧澤贱呐,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布丧诺,位于F島的核電站,受9級(jí)特大地震影響奄薇,放射性物質(zhì)發(fā)生泄漏驳阎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一馁蒂、第九天 我趴在偏房一處隱蔽的房頂上張望呵晚。 院中可真熱鬧,春花似錦沫屡、人聲如沸饵隙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽金矛。三九已至芯急,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驶俊,已是汗流浹背娶耍。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饼酿,地道東北人榕酒。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像故俐,于是被迫代替她去往敵國(guó)和親想鹰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 充滿陰霾的六月 自我成長(zhǎng)大概是最好的冒險(xiǎn). 能夠從今天的憂慮和混沌狀態(tài)邁向明天的清醒與理智! 人生就是一種冒險(xiǎn)刚陡,你...
    jamie_island閱讀 415評(píng)論 0 0
  • 31號(hào)作業(yè) 2階玩法后臺(tái)設(shè)計(jì)惩妇,海報(bào)做出來,可用的筐乳,話術(shù)準(zhǔn)備好 成員加入提醒 頭部信息:棒棒噠歌殃!你有一位新的好友幫你...
    楊秋意閱讀 142評(píng)論 0 0
  • Today a reader ,Tomorrow a leader. 今日之閱讀者蝙云,明日之領(lǐng)導(dǎo)者氓皱。 Read to...
    Smile在三一閱讀 311評(píng)論 0 2
  • 冰心《不為什么》“有一次,幼小的我勃刨,忽然走到母親面前波材,仰著臉問:“媽媽,你到底為什么愛我?”母親放下針線身隐,用她的面...
    累累我的兒閱讀 317評(píng)論 0 1
  • 早餐廷区,跟娃說今早正式去上語言表演課。 娃:媽媽贾铝,我吃飽了O肚帷(沒有吃完一碗粥)我:你確定嗎?還記得上次那個(gè)弟弟嗎垢揩?不...
    大大媽閱讀 232評(píng)論 0 1