java 大文件分割与组装
注意:这里说的就是“物理分割”,是真的会把文件分开
不多说,直接上代码
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 大文件分割与组装的更多相关文章
- android下大文件分割上传
由于android自身的原因,对大文件(如影视频文件)的操作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题. 文件分割后分多次请求服务. //文件分割上传 ...
- c#大文件分割过程
需求: 在项目开发中,我们会遇到单个文件大小超过1TB的文件,这样的文件只能进行单文件读取,往往会造成读取完成耗时过长,导致客户在使用体验过程中不满意. 为了解决提升大文件的解析速度,我想到了先分割大 ...
- PHP + JS 实现大文件分割上传
服务器上传文件会有一定的限制.避免内存消耗过大影响性能,在 php.ini 配置文件中,有几个影响参数: upload_max_filesize = 2M //PHP最大能接受的文件大小 post_m ...
- Java:大文件拆分工具
java大文件拆分工具(过滤掉表头) import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File ...
- Linux大文件分割splite
/********************************************************************** * Linux大文件分割splite * 说明: * 编 ...
- Html5 突破微信限制实现大文件分割上传
先来前端代码 <!DOCTYPE html> <html> <head> <meta name="viewport" content=&q ...
- c# 大文件分割 复制 Filestream 进度条
大文件分割复制,每次复制100M 也可以复制别的较大数值. 小于1G的小文件就直接复制得了.代码里没写 ,但是很简单 直接写进去就好了,难得是分割复制 所以没写. 好吧 我还是改了 改成小文件也可以复 ...
- 大文件分割、命令脚本 - Python
日志文件分割.命名 工作中经常会收到测试同学.客户同学提供的日志文件,其中不乏几百M一G的也都有,毕竟压测一晚上产生的日志量还是很可观的,xDxD,因此不可避免的需要对日志进行分割,通常定位问题需要针 ...
- Linux中split大文件分割和cat合并文件
当需要将较大的数据上传到服务器,或从服务器下载较大的日志文件时,往往会因为网络或其它原因而导致传输中断而不得不重新传输.这种情况下,可以先将大文件分割成小文件后分批传输,传完后再合并文件. 1.分割 ...
随机推荐
- Express框架之Jade模板引擎使用
日期:2018-7-8 十月梦想 node.js 浏览:2952次 评论:0条 前段时间讲说了ejs模板引擎,提到了jade的效率等等问题!今天在这里简单提一下jade的使用方式!结合expr ...
- 使用 SonarQube 来分析 .NET Core 项目代码问题
0.介绍 Sonar 是一款开源的代码分析工具,可能有很多人已经用过,本篇文章主要是讲解如何在 Docker 里面安装 Sonar 并且用其来分析 .Net Core 项目. Sonar 是一个用于代 ...
- 【WebAPI No.1】创建简单的 .NETCore WebApi
介绍: 官方定义如下,强调两个关键点,即可以对接各种客户端(浏览器,移动设备),构建http服务的框架.Web API最重要的是可以构建面向各种客户端的服务. core的WebAPI与ASP.NET ...
- Ubuntu下将python从2.7升级到3.5
在ubuntu 的终端中用代码下载最新的Python sudo apt-get install python3 系统会提示输入Linux 的密码,输入密码后下载 刚才下载的Python程序被安装在us ...
- mybatis框架(4)---输入输出映射
输入输出映射 通过parameterType制定输入参数类型 类型可以是简单类型(int String)也可以是POJO本身 或者包装类 1输入映射 关于输入简单类型和pojo本身的我就不写了,因为比 ...
- spring-boot-maven-plugin插件的作用
要记住:spring-boot-maven-plugin插件在打Jar包时会引入依赖包 可以打成直接运行的Jar包 maven项目的pom.xml中,添加了org.springframework.bo ...
- 一个前端开发者换电脑的过程(git篇)
一,安装git. 要安装git,首先得把它下载下来.去到git官网. 现在开始安装. 讲真,这些东西哪些要勾哪些不要勾我也不清楚,所以全部都按默认的来,一路next. 现在再打开vscode的终端,发 ...
- java泛型【收藏】
什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个 ...
- JavaScript和Ajax部分(1)
1. JavaScript变量有哪些数据类型? JavaScript是一种弱类型语言,在声明变量时不需要指变量的类型,变量的类型由赋给变量的值来决定. 常用的基本数据类型: 1 undefined(未 ...
- ES6躬行记(9)——字符串
在介绍字符串之前,有必要先了解一点Unicode的基础知识,有助于理解ES6提供的新功能和新特性. 一.Unicode Unicode是一种字符集(即多个字符的集合),它的目标是涵盖世界上的所有字符, ...