Java 文件分块及合并

利用Base64编码,再截字符串,仅支持小文件小文件文件名随机,所以要将大文件信息和小文件顺序写入到小文件的第一行
    <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>1.6</version>
    </dependency>
import org.apache.commons.codec.binary.Base64;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by Liwj on 2016/8/23.
 */
public class FileSplit {

    /**
     * 分割
     * @param fileName 文件路径
     * @param Number 分块文件个数
     * @throws Exception
     */
    public void splitByNumber(String fileName,int Number) throws Exception{
        File oldFile=new File(fileName);
        BufferedInputStream in=new BufferedInputStream(new FileInputStream(oldFile));
        String file=encode(in);
        int length=file.length();
        System.out.println("字符串长度:"+length);
        int size=length/Number;
        int start=0,end=size;
        BufferedOutputStream out=null;
        File newFile=null;
        String str_temp=null;
        for(int i=0;i<Number-1;i++){
            str_temp=i+" "+oldFile.getName()+"\n";
            str_temp+=file.substring(start,end);
            newFile=new File("E:\\result\\"+randNumber()+".file");
            out=new BufferedOutputStream(new FileOutputStream(newFile));
            out.write(str_temp.getBytes());
            out.close();
            start+=size;
            end+=size;
        }
        str_temp=Number-1+" "+oldFile.getName()+"\n";
        str_temp+=file.substring(start);
        newFile=new File("E:\\result\\"+randNumber()+".file");
        out=new BufferedOutputStream(new FileOutputStream(newFile));
        out.write(str_temp.getBytes());
        out.close();
        return;
    }

    /**
     * 文件合并
     * @param path
     * @throws Exception
     */
    public void mergeByName(String path) throws Exception{
        File file=new File(path);
        File list[]=file.listFiles();
        Map<String,String> map=new HashMap<String, String>();
        String newFileName=null;
        for(File f:list){
            BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(f)));
            String str_head=reader.readLine();
            String id=str_head.substring(0,str_head.indexOf(" "));
            newFileName=str_head.substring(str_head.indexOf(" ")+1);
            map.put(id,f.getAbsolutePath());
            reader.close();
        }

        StringBuffer stringBuffer=new StringBuffer();
        for(int i=0;i<list.length;i++){
            File f=new File(map.get(String.valueOf(i)));
            BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(f)));
            reader.readLine();
            String temp=null;
            while ((temp=reader.readLine())!=null){
                stringBuffer.append(temp);
            }
            reader.close();
        }
        BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream("E:\\answer\\"+newFileName));
        out.write(decode(stringBuffer.toString()));
        out.close();
    }

    /**
     * 编码
     * @param in
     * @return
     * @throws IOException
     */
    public String encode(InputStream in) throws IOException{
        byte[] data = new byte[in.available()];
        in.read(data);
        return Base64.encodeBase64String(data);
    }

    /**
     * 解码
     * @param base64Str
     * @return
     * @throws IOException
     */
    public byte[] decode(String base64Str)throws IOException{
        return Base64.decodeBase64(base64Str);
    }

    /**
     * 随机数
     * @return
     */
    public String randNumber(){
        double number=Math.random();
        String str= String.valueOf(number);
        str=str.replace(".","");
        return str;
    }
    public static void main(String[] args){
        try {
            //分块
            //new FileSplit().splitByNumber("E:\\20160824134947.jpg",10);
            //合并
            //new FileSplit().mergeByName("E:\\result\\");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
时间: 2024-10-21 10:22:56

Java 文件分块及合并的相关文章

java文件分割和合并

package search; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class Split {

JAVA之IO技术 合并文件--有bug哦

/*将三个文本文件的内容copy到一个文件中. * 基本思路:通过续写的方式. * * JAVA之IO技术中提供了一个可串联的字节输入流对象. * * 合并流对象 * SequenceInputStream: * SequenceInputStream 表示其他输入流的逻辑串联. * 它从输入流的有序集合开始,并从第一个输入流开始读取, * 直到到达文件末尾,接着从第二个输入流读取,依次类推, * 直到到达包含的最后一个输入流的文件末尾为止. * 有两个构造函数: * SequenceInput

黑马程序员——java——文件的切割与合并

<p style="color: rgb(54, 46, 43); font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-family: 微软雅黑; line-height: 30.796875px; text-indent: 28px;">------ <a href="http://www.itheima.com" t

java:快速文件分割及合并

文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位,对文件进行分割或合并. 看下基本思路: 如果有一个大文件,指定分割大小后(比如:按1M切割) step 1: 先根据原始文件大小.分割大小,算出最终分割的小文件数N step 2: 在磁盘上创建这N个小文件 step 3: 开多个线程(线程数=分割文件数),每个线程里,利用RandomAccessF

(转)java:快速文件分割及合并

文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位,对文件进行分割或合并. 看下基本思路: 如果有一个大文件,指定分割大小后(比如:按1M切割) step 1: 先根据原始文件大小.分割大小,算出最终分割的小文件数N step 2: 在磁盘上创建这N个小文件 step 3: 开多个线程(线程数=分割文件数),每个线程里,利用RandomAccessF

Java 文件拼接器

1. 功能描述: 实现指定目录下相同类型的文件拼接成一个文件, 拼接效果如代码所示. 涉及内容: 反射, io, 递归 1.1 xml 的拼接: <!-- \pom.xml --> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:

3.Java文件操作

概述 1.File类 字段摘要 构造方法 概述 1. File类 2. IO流的原理以及概念 3. IO流的体系 4. 字节流和字符流 5. 处理流 6. 文件拷贝 7. 文件分割与合并 1.File类 File类是文件和目录路径名的抽象形式.一个File对象可以代表一个文件或目录,但是不是完全对应的. File类对象主要用来获取文件本身的一些信息.目的在于:建立java程序和文件(文件夹)之间的联系.以便java程序对文件操作. 字段摘要 以下四种字段均与系统有关,主要是用来动态的书写路径,其

JAVA之File类-将指定目录下的所有java文件的绝对路径存储到文本文件中

/* * 将指定目录下的所有java文件的绝对路径存储到文本文件中 * 建立一个java列表. * 思路: * 1.对指定目录进行递归 * 2.获取递归过程所有的java文件的路径 * 3.将这些路径存储在集合中 * 4.将集合中的内容写到文本文件 * 注:3,4步骤也可以合并成一个步骤 */ package ioTest.io3; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; imp

JAVA核心技术I---JAVA基础知识(文件系统及java文件基本操作)

一:文件概述 文件系统是由OS(操作系统)管理的 文件系统和Java进程是平行的,是两套系统 文件系统是由文件夹和文件递归组合而成 文件目录分隔符 –Linux/Unix 用/隔开 –Windows用\隔开,涉及到转义,在程序中需用/或\\代替 文件包括文件里面的内容和文件基本属性 文件基本属性:名称.大小.扩展名.修改时间等 二:文件类File java.io.File是文件和目录的重要类(JDK6及以前是唯一) –目录也使用File类进行表示 File类与OS无关,但会受到OS的权限限制 常