注意:这里说的就是“物理分割”,是真的会把文件分开
  不多说,直接上代码
1 import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; /*
*功能:将800M以上大文件(不分类型)切割成为2M/ per part
*@date:2018/7/9/23:31
*@author:Yoci
*/
public class GeAndZhuang{
public static void sCut(File f, int partSize) {
if(f.length()>2048*1024) {
System.out.println("启动成功");
int count = (int)(Math.ceil(f.length() / partSize))+1;//块数
System.out.println("块数"+count);
try {
/**创建输入输出流对象*/
InputStream inf = new FileInputStream(f);
System.out.println("输入流启动成功");
OutputStream[] outf = new FileOutputStream[count];
System.out.println("输出流启动成功:"+outf.length);
/**创建文件夹,存储各小块文件*/
int no = f.getName().lastIndexOf(".");
String str = f.getParent()+"\\"+f.getName().substring(0, no );/**目录路径*/
File dirfile = new File(str);
if(!dirfile.exists()) {
dirfile.mkdirs();
}
/**创建各小块文件并命名*/
File[] dir_f = new File[count];
System.out.println("数组创建成功:"+dir_f.length);
/**获取文件类型*/
String fName = f.getName();
String fPattern = fName.substring(fName.lastIndexOf("."), fName.length());
System.out.println("文件类型获取成功:"+fPattern);
for(int j=0; j<count; j++) {
String newPath = str+"\\"+f.getName().substring(0, no)+"-"+j+fPattern;
dir_f[j] = new File(newPath);
outf[j] = new FileOutputStream(dir_f[j]);
}
/**写入各块内容*/
int s,m=0, n=2*1024*1024;
byte[] buffer = new byte[n];
s = inf.read(buffer, 0, n);
while(s != -1&& m<count) {
if(dir_f[m].length() < 2048*1024) {
outf[m].write(buffer, 0, n);
s = inf.read(buffer, 0, n);
}
if(dir_f[m].length() == 2048*1024){
outf[m].close();
m = m+1;
int off = (int)(f.length()-m*2048*1024);
if(off<2048*1024) {
outf[m].write(buffer, 0, off);
outf[m].close();
break;
}
}
}
inf.close();
f.delete();
}
catch(IOException ioe) {
System.out.println("IO 异常");
}
catch(IndexOutOfBoundsException ine) {
System.out.println("数组越界 异常");
}
catch(Exception e) {
System.out.println("异常");
}
}
else {
System.out.println("启动失败");
}
}
public static void divide( String fPath ) {
File f = new File(fPath);
/**文件存在*/
if(f.exists()){
/**是单个文件*/
if(f.isFile() && f.length() > 2048*1024) {
/**调用单文件分割方法*/
sCut(f, 2048*1024);
}
/**是目录*/
else if(f.isDirectory() && f.length() > 2048*1024) {
/**目录文件数组化*/
File[] dir = f.listFiles(); for(int i=0; i<dir.length; i++) {
if(dir[i].exists() && dir[i].length() > 2048*1024){
if(dir[i].isFile()) {
sCut(dir[i], 2048*1024);
}
else if(dir[i].isDirectory() && dir[i].length() > 2048*1024) {
divide(dir[i].getAbsolutePath());
}
}
else {
System.out.println(dir[i].getAbsolutePath()+ "文件或目录较小,无需处理!");
}
}
}
}
else {
System.out.println(fPath + " 不存在,分割失败!");
}
}
/**
*小块组装/还原
*@param fPath 待组装的文件/目录绝对路径
*@return null
*思路:扫描文件/目录,当遇到内部文件以 文件夹名 命名且予以编号时,合并文件夹内所有文件并覆盖此文件夹
*result:文件/目录属性与分割前相同
*/
public static void pack( String fPath ) {
File f = new File(fPath);
boolean flag = false;
int t, num = 0;
if(f.exists()){
if(f.isDirectory()) {
File[] dir = f.listFiles();
for(t=0; t<dir.length; t++) {
if(dir[t].isFile()) {
if(dir[t].getName().lastIndexOf("-") != -1) {
String cutName = dir[t].getName().substring(0, dir[t].getName().lastIndexOf("-"));
if(f.getName().compareTo(cutName) == 0) {
flag = true;
num += 1;
}
else {
flag = false;
}
}
}
else if(dir[t].isDirectory()) {
pack(dir[t].getAbsolutePath());
}
}
/**组装开始*/
if(flag == true && num == dir.length) {
try {
/**重新构建路径=文件夹路径+后缀*/
String dirName = dir[0].getName();
int begin = dirName.lastIndexOf(".");
String coverPath = f.getAbsolutePath() + dirName.substring(begin, dirName.length());
File coverFile = new File(coverPath); /**构建输入输出流:
* 输入流:packIn dir 文件夹中的编号文件
* 输出流:packOut coverFile
*/
OutputStream packOut = new FileOutputStream(coverFile, true);
int sizeOfDir = dir.length;
for(t=0; t< sizeOfDir; t++)
{
for(int k=0; k<sizeOfDir; k++) {
int b = dir[k].getName().lastIndexOf("-");
int e = dir[k].getName().lastIndexOf(".");
/**找到与 序号匹配的 文件 写入*/
if(dir[k].getName().substring(b+1, e) .compareTo(String.valueOf(t))==0) {
//System.out.println(t+" "+ dir[k].getName().substring(b+1, e));
InputStream packIn = new FileInputStream(dir[k]);
int s, n=2*1024*1024;
byte[] buffer = new byte[n];
s = packIn.read(buffer, 0, n);
if(dir[k].length()==2*1024*1024) {
packOut.write(buffer, 0, n);
packIn.close();
dir[k].delete();
}
else {
int end = (int)dir[k].length();
packOut.write(buffer, 0, end);
packIn.close();
dir[k].delete();
}
break;
}
}
}
packOut.close();
System.out.println("文件数:"+dir.length);
f.delete();
}
catch(Exception e) {
System.out.println("异常");
}
}
}
}
}
public static void main(String[] args) {
String path = "F:\\2221511550\\Videos\\26.20 - 副本.mp4";//要切割的文件/目录路径
divide(path);//切割
pack("F:\\2221511550\\Videos\\26.20 - 副本");//组装(给出路径)
}
}

java 大文件分割与组装的更多相关文章

  1. android下大文件分割上传

    由于android自身的原因,对大文件(如影视频文件)的操作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题. 文件分割后分多次请求服务. //文件分割上传 ...

  2. c#大文件分割过程

    需求: 在项目开发中,我们会遇到单个文件大小超过1TB的文件,这样的文件只能进行单文件读取,往往会造成读取完成耗时过长,导致客户在使用体验过程中不满意. 为了解决提升大文件的解析速度,我想到了先分割大 ...

  3. PHP + JS 实现大文件分割上传

    服务器上传文件会有一定的限制.避免内存消耗过大影响性能,在 php.ini 配置文件中,有几个影响参数: upload_max_filesize = 2M //PHP最大能接受的文件大小 post_m ...

  4. Java:大文件拆分工具

    java大文件拆分工具(过滤掉表头) import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File ...

  5. Linux大文件分割splite

    /********************************************************************** * Linux大文件分割splite * 说明: * 编 ...

  6. Html5 突破微信限制实现大文件分割上传

    先来前端代码 <!DOCTYPE html> <html> <head> <meta name="viewport" content=&q ...

  7. c# 大文件分割 复制 Filestream 进度条

    大文件分割复制,每次复制100M 也可以复制别的较大数值. 小于1G的小文件就直接复制得了.代码里没写 ,但是很简单 直接写进去就好了,难得是分割复制 所以没写. 好吧 我还是改了 改成小文件也可以复 ...

  8. 大文件分割、命令脚本 - Python

    日志文件分割.命名 工作中经常会收到测试同学.客户同学提供的日志文件,其中不乏几百M一G的也都有,毕竟压测一晚上产生的日志量还是很可观的,xDxD,因此不可避免的需要对日志进行分割,通常定位问题需要针 ...

  9. Linux中split大文件分割和cat合并文件

    当需要将较大的数据上传到服务器,或从服务器下载较大的日志文件时,往往会因为网络或其它原因而导致传输中断而不得不重新传输.这种情况下,可以先将大文件分割成小文件后分批传输,传完后再合并文件. 1.分割 ...

随机推荐

  1. 阿里云申请ssl证书

    申请证书(本文以阿里云服务器为背景,申请证书也以阿里云域名申请证书来作为实例) (1)登陆阿里云服务器,初次配置的用户,不建议直接搜索‘ssl证书’进行购买,因为这样购买后证书与域名对应的引导性并不强 ...

  2. 人脸识别&ORC的Demo

    一.用到的jar包: face_sdk-1.3.4.jar json-20160810.jar ocr_sdk-1.3.4.jar 下载地址:https://files.cnblogs.com/fil ...

  3. Vc数据库编程基础MySql数据库的表查询功能

    Vc数据库编程基础MySql数据库的表查询功能 一丶简介 不管是任何数据库.都会有查询功能.而且是很重要的功能.上一讲知识简单的讲解了表的查询所有. 那么这次我们需要掌握的则是. 1.使用select ...

  4. ES6躬行记(1)——let和const

    古语云:“纸上得来终觉浅,绝知此事要躬行”.的确,不管看了多少本书,如果自己不实践,那么就很难领会其中的精髓.自己研读过许多ES6相关的书籍和资料,平时工作中也会用到,但在用到时经常需要上搜索引擎中查 ...

  5. Zookeeper系列目录

    1.zookeeper安装和参数配置 2.zookeeper的适用场景 3.zookeeper客户端的实现以及使用--watcher机制 session机制 重连恢复机制 异步io

  6. Python中斐波那契数列的赋值逻辑

    斐波那契数列 斐波那契数列又称费氏数列,是数学家Leonardoda Fibonacci发现的.指的是0.1.1.2.3.5.8.13.21.34.······这样的数列.即从0和1开始,第n项等于第 ...

  7. [转]如何将高版本的SQL Server数据库备份到低版本的SQL Server

    本文转自:https://blog.csdn.net/wang465745776/article/details/54969676 前提条件备份SQL Server服务器版本为:12.0.2000.8 ...

  8. [转]MySQL-死锁查询

    本文转自:https://blog.csdn.net/qq105319914/article/details/50562783 1.查询是否锁表 show OPEN TABLES where In_u ...

  9. java体系架构

    java概念 java本身是一种面向对象的语言,最显著的特性有两方面,一是所谓的“书写一次,到处运行”(write once ,run anywhrer),能够非常容易的获得跨平台能力,另外就是垃圾收 ...

  10. Syncrhonized 和 Lock的区别和使用

    相信很多小伙伴们初学多线程的时候会被这两个名词搞晕,所以这里专门介绍这两种实现多线程锁的方式的区别和使用场景 Synchronized 这个关键词大家肯定都不陌生,具体的用法就是使用在对象.类.方法上 ...