注意:这里说的就是“物理分割”,是真的会把文件分开
  不多说,直接上代码
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. NuGet 构建服务器与常用命令

    公司出于某些原因需要自己在内部网络搭建一个私有的 Nuget 服务器,而且要运行在 Linux服务器上面.如果说 Windows 下搭建的话很简单,直接在项目当中引入 Nuget 的库就 OK,这儿的 ...

  2. kibana6.2.4版本更新x-pack认证

    我在上一次介绍了如何安装时基本使用elk留下了一个问题,这次来解决这个问题,相必大家也想知道,接下来就看详细过程. 上次说到,直接看图吧. 因为x-pack是收费的,所以试用期只有一个月.长期使用就必 ...

  3. 有关 Azure 机器学习的 Net# 神经网络规范语言的指南

    Net# 是由 Microsoft 开发的一种用于定义神经网络体系结构的语言. 使用 Net# 定义神经网络的结构使定义复杂结构(如深层神经网络或任意维度的卷积)变得可能,这些复杂结构被认为可提高对数 ...

  4. 剑指offer例题分享--7

    前言:继续前面的分享... 面试题31: 代码如下: #include<iostream> #include<limits.h> using namespace std; bo ...

  5. 增加Myecllipse内存

    1.打开MyEclipse后,进入Windows/Preferences/Java/Installed JREs 点击后,在右边窗口选择JREs,双击后进入 2.在Default VM Argumen ...

  6. 使用IntelliJ IDEA新建Java Web后端resfulAPI模板

    初始化项目 打开IntelliJ IDEA,我的版本是Version 2018.1.4.点击Create New Project.在左侧的列表中选择Maven.然后在右侧勾选Create from a ...

  7. 【干货】利用MVC5+EF6搭建博客系统(一)EF Code frist、实现泛型数据仓储以及业务逻辑

    习MVC有一段时间了,决定自己写一套Demo了,写完源码再共享. PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可. 一.框架搭建 二.创建数据库 1.创建一个空的EF code fr ...

  8. 1.Magicodes.NET框架之路——起航

    1.Magicodes.NET框架之路--起航 前言 从事开发也好几年了,并且最近一直在做架构搭建的工作.这些时间,最大的感悟就是: 只有自己理解了的才是自己的. 对架构这块,若欲立之,必先破之. 故 ...

  9. 业务开发(二)—— Spring框架

    0x01.使用枚举类,在MyBatis中 到了mapper.xml文件那里,如Status要与1进行对比,而不是1所对应的枚举字符串. 0x02.分页 Dao获取到的记录数,在Controller层放 ...

  10. SELECT INTO和INSERT INTO SELECT的区别

    数据库中的数据复制备份 SELECT INTO: 形式: SELECT value1,value2,value3 INTO Table_2 FROM Table_1 Table_2表存在,报错:数据库 ...