无线&移动互联网技术研发

换位思考·····
posts - 19, comments - 53, trackbacks - 0, articles - 283
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

java 文件分割

Posted on 2009-06-14 23:28 Gavin.lee 阅读(935) 评论(0)  编辑  收藏 所属分类: Log && File Operate

今天一哥们在我电脑上下小说,《七界传说》 啥玩意我也不知道。我帮忙下的,下完了吓死我了,接近10M,这玩意放手机里根本没法看,哥们说要分,完了就开始拖啊,分啊。后来我一想,不如用程序分,分的还均匀。呵呵,google一下,找了段程序,稍调试了一把,测试OK.

package com.handson.bbs;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

/**
 * **********************************************
 * @description 文件分割器,
 *         将一个文件分割成若干小文件,将多个小文件合并到一个大文件
 * 
@author Gavin.lee
 * @date Jun 14, 2009    3:05:08 PM
 * 
@version 1.0
 ***********************************************
 
*/

public class FileDivisionUniter {

    
public static final String SUFFIX = ".txt"// 分割后的文件名后缀

    
/**
     * 分割文件
     * 
@param fileName 待分割的文件名
     * 
@param size 小文件的大小,以字节为单位
     * 
@return 分割后小文件的文件名
     * 
@throws Exception 分割过程中可能抛出的异常
     
*/

    
public static String[] divide(String fileName, long size) throws Exception {
        File inFile 
= new File(fileName);
        
if (!inFile.exists() || inFile.isDirectory()) {
            
throw new Exception("指定文件不存在!");
        }

        
// 获得被分割文件父文件,将来被分割成的小文件就存放在这个目录下
        File parentFile = inFile.getParentFile();

        
// 取得文件的大小
        long fileLength = inFile.length();
        
if (size <= 0)
            size 
= fileLength / 2;

        
// 取得分割后的小文件的数目
        int num = (int) ((fileLength + size - 1/ size);

        
// 存放分割后的小文件名
        String[] outFileNames = new String[num];

        FileInputStream in 
= new FileInputStream(inFile);

        
// 读输入文件流的开始和结束下标
        long inEndIndex = 0;
        
int inBeginIndex = 0;

        
// 根据要分割的数目分割文件
        for (int outFileIndex = 0; outFileIndex < num; outFileIndex++{
            
// 对于前outFileIndex-1个文件,大小都是size
            File outFile = new File(parentFile, inFile.getName() + outFileIndex    + SUFFIX);
            FileOutputStream out 
= new FileOutputStream(outFile);
            inEndIndex 
+= size;
            inEndIndex 
= (inEndIndex > fileLength) ? fileLength : inEndIndex;
            
// 从输入流中读取字节存储到输出流中
            for (; inBeginIndex < inEndIndex; inBeginIndex++)
                out.write(in.read());
            out.close();
            outFileNames[outFileIndex] 
= outFile.getAbsolutePath();
        }

        in.close();
        
return outFileNames;
    }


    
/**
     * 合并文件
     * 
@param fileNames 带合并的文件名,是一个数组
     * 
@param targerFileName 目标文件名
     * 
@return 目标文件的全路径
     * 
@throws Exception 合并过程中可能抛出的异常
     
*/

    
public static String unite(String[] fileNames, String targerFileName)
            
throws Exception {
        File inFile 
= null;

        File outFile 
= new File(targerFileName);
        FileOutputStream out 
= new FileOutputStream(outFile);

        
for (int i = 0; i < fileNames.length; i++{
            inFile 
= new File(fileNames[i]);
            FileInputStream in 
= new FileInputStream(inFile);
            
int c;
            
while ((c = in.read()) != -1)
                out.write(c);
            in.close();
        }

        out.close();
        
return outFile.getAbsolutePath();
    }


    
public static void main(String[] args) throws Exception {
        String fileName 
= "c:/七界传说.txt";
        
long size = 1024*1000;
        String[] fileNames 
= FileDivisionUniter.divide(fileName, size);
        System.out.println(
"分割文件" + fileName + "结果");
        
for (int i = 0; i < fileNames.length; i++)
            System.out.println(fileNames[i]);

//        String newFileName = "c:/newtest.txt";
//        String arr[] = new String[10];
//        arr[0] = "c:/七界传说.txt0.txt";
//        arr[1] = "c:/七界传说.txt1.txt";
//        arr[2] = "c:/七界传说.txt2.txt";
//        arr[3] = "c:/七界传说.txt3.txt";
//        arr[4] = "c:/七界传说.txt4.txt";
//        arr[5] = "c:/七界传说.txt5.txt";
//        arr[6] = "c:/七界传说.txt6.txt";
//        arr[7] = "c:/七界传说.txt7.txt";
//        arr[8] = "c:/七界传说.txt8.txt";
//        arr[9] = "c:/七界传说.txt9.txt";
//        
//        System.out.println("合并结果:"+ FileDivisionUniter.unite(arr, newFileName));
    }


}


只有注册用户登录后才能发表评论。


网站导航: