⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filecombination.java

📁 用java编制的断点续传的源程序
💻 JAVA
字号:
package com.downfile;

/**
 * 合并文件:合并由拆分文件拆分的文件
 * 要求将拆分文件放到一个文件夹中
 * 主要利用随机文件读取和文件输入输出流
 */
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.RandomAccessFile;

import java.util.Arrays;
import java.util.StringTokenizer;

/**
 * 合并文件:合并由拆分文件拆分的文件
 * 要求将拆分文件放到一个文件夹中
 * 主要利用随机文件读取和文件输入输出流
 */
public class

FileCombination extends Thread {
    String srcDirectory = null; //拆分文件存放的目录
    String trueDirectory; //结果文件存放目录
    String[] separatedFiles; //存放所有拆分文件名
    String[][] separatedFilesAndSize; //存放所有拆分文件名及分件大小
    int FileNum = 0; //确定文件个数
    String fileRealName = ""; //据拆分文件名确定现在原文件名
    String urlFile;

    public FileCombination(String trueDirectory, String srcDirectory, 
                           String urlFile) {
        this.srcDirectory = srcDirectory;
        this.trueDirectory = trueDirectory;
        this.urlFile = urlFile;
    }

    /**
     *
     * @param sFileName 任一一个拆分文件名
     * @return 原文件名
     */
    private String getRealName(String sFileName) {
        //System.out.println("sFileName:"+sFileName);
        //如果文件名是Thunder5.6.8.329.exe这样就比较特殊了的,所以要全部都取完
        StringTokenizer st = new StringTokenizer(sFileName, ".");
        int Tokens;
        Tokens=st.countTokens();
        String tName="";
        for(int i=1;i<Tokens;i++) {
            tName=tName+st.nextToken();            
            if(i<(Tokens-1)) {
                tName=tName+".";
            }
        }
        return tName;
    }

    /**
     * 取得指定拆分文件模块的文件大小
     * @param FileName 拆分的文件名
     * @return
     */
    private long getFileSize(String FileName) {
        FileName = srcDirectory + "\\" + FileName;
        return (new File(FileName).length());
    }

    /**
     * 生成一些属性,做初使化
     * @param drictory 拆分文件目录
     */
    private void getFileAttribute(String drictory) {        
        File file = new File(drictory);
        separatedFiles = new String[file.list().length]; //依文件数目动态生成一维数组,只有文件名
        separatedFiles = file.list();
        //依文件数目动态生成二维数组,包括文件名和文件大小
        //第一维装文件名,第二维为该文件的字节大小
        separatedFilesAndSize = new String[separatedFiles.length][2];
        Arrays.sort(separatedFiles); //排序
        FileNum = separatedFiles.length; //当前文件夹下面有多少个文件
        for (int i = 0; i < FileNum; i++) {
            separatedFilesAndSize[i][0] = separatedFiles[i]; //文件名
            separatedFilesAndSize[i][1] = 
                    String.valueOf(getFileSize(separatedFiles[i])); //文件大上
        }        
        fileRealName = getRealName(separatedFiles[FileNum - 1]); //取得文件分隔前的原文件名
    }

    /**
     * 合并文件:利用随机文件读写
     * @return true为成功合并文件
     */
    private boolean CombFile() {
        RandomAccessFile raf = null;
        long alreadyWrite = 0;
        FileInputStream fis = null;
        int len = 0;
        byte[] bt = new byte[1024];
        try {
            
            raf = 
new RandomAccessFile(trueDirectory + "\\" + fileRealName, "rw");
            for (int i = 0; i < FileNum; i++) {
                raf.seek(alreadyWrite);
                //System.out.println("alreadyWrite:"+alreadyWrite);
                fis = 
new FileInputStream(srcDirectory + "\\" + separatedFilesAndSize[i][0]);
                while ((len = fis.read(bt)) > 0) {
                    raf.write(bt, 0, len);
                }
                fis.close();
                alreadyWrite = 
                        alreadyWrite + Long.parseLong(separatedFilesAndSize[i][1]);
            }
            raf.close();
        } catch (Exception e) {
            e.printStackTrace();
            try {
                if (raf != null)
                    raf.close();
                if (fis != null)
                    fis.close();
            } catch (IOException f) {
                f.printStackTrace();
            }
            return false;
        }
        return true;
    }

    /**
     * 删除临时文件及用过的临时文件夹
     */
    public void deleteTmp() {
        //删除临时文件夹下面的所有临时文件
        for (int i = 0; i < FileNum; i++) {
            File file = 
                new File(srcDirectory + "\\" + separatedFilesAndSize[i][0]);
            file.delete();            
        }
        //删除临时文件夹
        File file1 = new File(srcDirectory);
        file1.delete();
    }

    public void run() {
        getFileAttribute(srcDirectory);
        if (CombFile() == true) {
            deleteTmp();
            //从XML文件中删除对应项
            FileDownInformationWithXML xmlFile = 
                new FileDownInformationWithXML(trueDirectory);
            synchronized (this) {
                xmlFile.removeOneDownRecord(urlFile);
                xmlFile.saveChange();
            }
            //如果没有下载项了,那么就把该XML文件删除掉
            if(xmlFile.checkXMLIsEmpey()==true)
                xmlFile.deleteXMLFile();
        }

    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -