public class FileTest {

/**

* 文件分隔器:给定文件的路径和每一块要拆分的大小,就可以按要求拆分文件

* 如果指定的块给原文件都还要大,为了不动原文件,就生成另一个文件,以.bak为后缀,这样可以保证原文件

* 如果是程序自动拆分为多个文件,那么后缀分别为".part序号",这样就可以方便文件的合并了

* 原理:很简单,就是利用是输入输出流,加上随机文件读取。

*/

String FileName=null;//原文件名

long FileSize=0;//原文件的大小

long BlockNum=0;//可分的块数

/**

* @param fileAndPath 原文件名及路径

*/

private void getFileAttribute(String fileAndPath)//取得原文件的属性

{

File file=new File(fileAndPath);

FileName=file.getName();

FileSize=file.length();

}

/**

*

* @param blockSize 每一块的大小

* @return 能够分得的块数

*/

private long getBlockNum(long blockSize)//取得分块数

{

long fileSize=FileSize;

if(fileSize<=blockSize)//如果分块的小小只够分一个块

return 1;

else {

if(fileSize%blockSize>0) {

return fileSize/blockSize+1;

} else

return fileSize/blockSize;

}

}

/**

*

* @param fileAndPath 原文件及完整路径

* @param currentBlock 当前块的序号

* @return 现在拆分后块的文件名

*/

private String generateSeparatorFileName(String fileAndPath,int currentBlock)//生成折分后的文件名,以便于将来合将

{

return fileAndPath+".part"+currentBlock;

}

/**

*

* @param fileAndPath 原文件及完整路径

* @param fileSeparateName 文件分隔后要生成的文件名,与原文件在同一个目录下

* @param blockSize 当前块要写的字节数

* @param beginPos 从原文件的什么地方开始读取

* @return true为写入成功,false为写入失败

*/

private boolean writeFile(String fileAndPath,String fileSeparateName,long blockSize,long beginPos)//往硬盘写文件

{

RandomAccessFile raf=null;

FileOutputStream fos=null;

byte[] bt=new byte[1024];

long writeByte=0;

int len=0;

try {

raf = new RandomAccessFile(fileAndPath,"r");

raf.seek(beginPos);

fos = new FileOutputStream(fileSeparateName);

while((len=raf.read(bt))>0) {

if(writeByte

{

writeByte=writeByte+len;

if(writeByte<=blockSize)

fos.write(bt,0,len);

else {

len=len-(int)(writeByte-blockSize);

fos.write(bt,0,len);

}

}

}

fos.close();

raf.close();

} catch (Exception e) {

e.printStackTrace();

try {

if(fos!=null)

fos.close();

if(raf!=null)

raf.close();

} catch(Exception f)

{

f.printStackTrace();

}

return false;

}

return true;

}

/**

* @param fileAndPath 原文路径及文件名

* @param blockSize 要拆分的每一块的大小

* @return true为拆分成功,false为拆分失败

*/

private boolean separatorFile(String fileAndPath,long blockSize)//折分文件主函数

{

getFileAttribute(fileAndPath);//将文件的名及大小属性取出来

//System.out.println("FileSize:"+FileSize);

//System.out.println("blockSize:"+blockSize);

BlockNum=getBlockNum(blockSize);//取得分块总数

//System.out.println("BlockNum:"+BlockNum);

//System.exit(0);

if(BlockNum==1)//如果只能够分一块,就一次性写入

blockSize=FileSize;

long writeSize=0;//每次写入的字节

long writeTotal=0;//已经写了的字节

String FileCurrentNameAndPath=null;

for(int i=1;i<=BlockNum;i++)

{

if(i

writeSize=blockSize;//取得每一次要写入的文件大小

else

writeSize=FileSize-writeTotal;

if(BlockNum==1)

FileCurrentNameAndPath=fileAndPath+".bak";

else

FileCurrentNameAndPath=generateSeparatorFileName(fileAndPath,i);

//System.out.print("本次写入:"+writeSize);

if(!writeFile(fileAndPath,FileCurrentNameAndPath,writeSize,writeTotal))//循环往硬盘写文件

return false;

writeTotal=writeTotal+writeSize;

//System.out.println("  总共写入:"+writeTotal);

}

return true;

}

public static void main(String[] args)

{

FileTest separator = new FileTest();

String fileAndPath="f://abc.txt";//文件名及路径

long blockSize=200*1024;//每一个文件块的大小,大小是按字节计算

if(separator.separatorFile(fileAndPath,blockSize)) {

System.out.println("文件折分成功!");

}

else {

System.out.println("文件折分失败!");

}

}

}

java 文件分隔_java 实现大文件分隔成多个小文件相关推荐

  1. Java把一个大集合拆分成多个小集合,可以利用多线程提升并发处理效率

    场景: 在开发中,如果一个集合中的数据量特别大,那么对这个集合进行循环处理业务可能就会比较耗时,为了提升效率,可以考虑把大集合拆分成多个小集合,然后用多线程对拆分后的多个小集合进行处理 拆分: 1.拆 ...

  2. java 读取大文件内容_java读取大文件

    java一般读取文件时,将文件文内容全部加在到内存,然后读取,但是这种读取方式很明显不适合读取大文件,在进行大文件处理时,考虑到内存有限,采用分次读取的方式. java分次读取文件内容有三种方式, 1 ...

  3. java 接口文件夹_Java NIO.2 使用Path接口来监听文件、文件夹变化

    Java7对NIO进行了大的改进,新增了许多功能: •对文件系统的访问提供了全面的支持 •提供了基于异步Channel的IO 这些新增的IO功能简称为 NIO.2,依然在java.nio包下. 早期的 ...

  4. java将一个大文件拆分成几个小文件输出

    java读取一个大文件写到多个小文件 最近看Java面试中有问到关于利用java io流,读取一个大文件,然后输出到几个小文件的问题,这里自己写了个简单的sample public static vo ...

  5. java 文件下载代码_java文件下载代码实例(单文件下载和多文件打包下载)

    这篇文章主要介绍了java文件下载代码实例(单文件下载和多文件打包下载),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 最近项目有需要写文件下载相关 ...

  6. java中的常用的文件流_Java 基础(四)| IO 流之使用文件流的正确姿势

    image.png 一.什么是 IO 流? 想象一个场景:我们在电脑上编辑文件,可以保存到硬盘上,也可以拷贝到 U 盘中.那这个看似简单的过程,背后其实是数据的传输. 数据的传输,也就是数据的流动.既 ...

  7. JAVA mac系统io文件流_Java IO流基础1--IO的分类体系与文件流

    什么是IO流 Java中的IO 了解什么是IO流之前,要先知道什么是IO.IO,就是in和out(即输入和输出),指应用程序和外部设备之间的数据传递,常见的外部设备包括文件.管道.网络连接等. 流的概 ...

  8. java 下载加速_Java实现大文件下载,提速30倍!想学?我教你啊!

    前言 兄弟们看到这个标题可能会觉得是个标题党,为了解决疑虑,我们先来看下最终的测试结果: 测试云盘下载的文件 46M,自己本地最大下载速度 2M 1. 单线程下载,总耗时: 603s img 2. 多 ...

  9. python将大文件拆分成多个小文件,同时对各小文件处理以节省时间

    # test.py import json import osroot_path = os.path.dirname(__file__)def f(x):return xtest_datas = [] ...

  10. 如何将一个文件分割成多个小文件

    你也许会遇到到这样一个问题?当你有一个较大的软件,而无法用一张软盘将其全部拷下时,你也许会想 到该将它分解开,分盘拷回去后,再将它们合并起来.现在的这种分割工具很多,你想自己动手做一个适合自己的分割工 ...

最新文章

  1. 小米回应暴力裁员:已提前三个月通知不续签合同,并且给了N+1补偿
  2. Wince 添加中文字库
  3. 到底什么成就了今天的人工智能?(下)
  4. 面试让HR都能听懂的MySQL锁机制,欢声笑语中搞懂MySQL锁
  5. MySql 一条普通的查询语句 你知道需要执行几次树的搜索操作以及会扫描多少行吗??? MySql 索引覆盖
  6. Vue的基础认知一---构建环境/v指令的使用
  7. 要做华为最强竞争对手,荣耀新动作曝光...
  8. 用C++开发与调用WebService的例子
  9. 在Windows Phone中使用HTML编程
  10. Windows下命令模式安装mysql
  11. matlab节约里程法_新手求大神指导,MATLAB中怎么使用节约里程法
  12. watir学习系列--对话框处理
  13. java的create vm_JNI_CreateJavaVM(Runtime::Create())
  14. OpenCV识别图形以及常用函数处理
  15. 细化算法matlab
  16. JPA 查询 未查询到时返回的list的size为0 但是引用并不为空
  17. IRPT_TAS用户协议
  18. 2021哔哩哔哩1024程序员节日第一弹:算法与安全
  19. Unity间接光 ibl(基于图像的渲染)和SH(球谐光照)
  20. PY-NumPy | 蓝色妖姬

热门文章

  1. 国产操作系统要起来,这款Linux是你的菜吗?
  2. 工业项目,用MCU还是PLC?
  3. 升级php影响zabbix吗,zabbix2.0升级到zabbix3.0
  4. 数字电子技术基础第三版杨志忠_阎石数字电子技术基础第6版笔记和课后习题详解...
  5. python super用法
  6. SQLServer之PRIMARY KEY约束
  7. Android 使用Picasso加载网络图片等比例缩放
  8. Django项目:CRM(客户关系管理系统)--12--05PerfectCRM实现King_admin注册功能获取内存01...
  9. 使用 NVM 管理不同的 Node.js 版本
  10. python的正则表达式 re-------可以在字符串前加上 r 这个前缀来避免部分疑惑,因为 r 开头的python字符串是 raw 字符串,所以里面的所有字符都不会被转义...