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.分割 ...
随机推荐
- IDEA整合Junit详细步骤
一.添加Junit插件. 1.file-->setting-->plugins-->搜索Junit-->安装插件(一般已默认安装,无需手动安装). 二.设置Junit测试参数: ...
- 微信公众平台开发——为何不能在网页调用微信jsapi?
说到这问题,相信大部分程序员老手都会轻蔑一笑,当然是跨域导致的啊!但是为了一些小白,我觉得还是很有必要再说一次的. 首先介绍什么是跨域,由于浏览器的同源策略,出于防范跨站脚本的攻击,禁止客户端脚本( ...
- linux 清空历史命令
系统版本:CentOS 6 history -c 命令可以清空当前窗口的历史输出命令. 要彻底删除历史命令可以有如下几种方式: 在当前用户的-目录下执行: 方式1: echo > .bash_h ...
- Microsoft 机器学习产品体系对比和介绍
Microsoft 提供多种多样的产品选项用于生成.部署和管理机器学习模型. 本文将比较这些产品,并帮助你选择所需的产品,以便最有效地开发机器学习解决方案. 机器学习产品 描述 作用 Azure云端服 ...
- mysql 开发进阶篇系列 55 权限与安全(安全事项 )
一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysql的安全问题进行了解. 1. 严格控制操作系统账号和权限 在数据库服务器上要严格控制操作系统的账号和权限, ...
- Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
vee-validate 是为 Vue.js 量身打造的表单校验框架,允许您校验输入的内容并显示对应的错误提示信息.它内置了很多常见的校验规则,可以组合使用多种校验规则,大部分场景只需要配置就能实现开 ...
- 在vue项目中添加特殊字体
这里的特殊字体,指的是一般用户电脑未安装到本地的字体,要引入这样的字体,首先需要把字体文件下载下来. 就像上图这样的,ttf格式的,然后在项目里添加它. 然后我们在font.css里用@font-fa ...
- Deep learning with Python 学习笔记(11)
总结 机器学习(machine learning)是人工智能的一个特殊子领域,其目标是仅靠观察训练数据来自动开发程序[即模型(model)].将数据转换为程序的这个过程叫作学习(learning) 深 ...
- SpringBoot(6) SpringBoot配置全局异常
1.全局异常 @ControllerAdvice 如果是返回json数据 则用 RestControllerAdvice,就可以不加 @ResponseBody //捕获全局异常,处理所有不可知的异常 ...
- MySQL中间件之ProxySQL(4):多层配置系统
返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.ProxySQL中的库 使用ProxySQL的Admin管理接口连 ...