之前在潭州教育教学网站上看了一个视频关于java大文件的分片与合并

自己在练习的时候遇到一些坑,调试了好长时间

代码如下:

首先配置一个专门放参数的类

SplitFileParam

public class SplitFileParam {public static String file="C:\\Users\\pc\\Desktop\\photo/1.jpg"; //文件的路径public static String outfile="C:\\Users\\pc\\Desktop\\photo/out.jpg"; //文件的路径public static int count=10;   //将文件切割成多少份
}

SplitFile

package SplitFileUtil;import jdk.nashorn.internal.runtime.logging.Logger;import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;public class SplitFile {public static void main(String[] args) {getSplitFile();merge(SplitFileParam.outfile,SplitFileParam.file,10);}/*** 文件分割方法*/public static void getSplitFile() {String file = SplitFileParam.file; //文件的路径int count = SplitFileParam.count; //文件分割的份数RandomAccessFile raf = null;try {//获取目标文件 预分配文件所占的空间 在磁盘中创建一个指定大小的文件   r 是只读raf = new RandomAccessFile(new File(file), "r");long length = raf.length();//文件的总长度long maxSize = length / count;//文件切片后的长度long offSet = 0L;//初始化偏移量for (int i = 0; i < count - 1; i++) { //最后一片单独处理long begin = offSet;long end = (i + 1) * maxSize;
//                offSet = writeFile(file, begin, end, i);offSet = getWrite(file, i, begin, end);}if (length - offSet > 0) {getWrite(file, count-1, offSet, length);}} catch (FileNotFoundException e) {System.out.println("没有找到文件");e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {raf.close();} catch (IOException e) {e.printStackTrace();}}}/*** 指定文件每一份的边界,写入不同文件中* @param file 源文件* @param index 源文件的顺序标识* @param begin 开始指针的位置* @param end 结束指针的位置* @return long*/public static long getWrite(String file,int index,long begin,long end){String a=file.split(".jpg")[0];long endPointer = 0L;try {//申明文件切割后的文件磁盘RandomAccessFile in = new RandomAccessFile(new File(file), "r");//定义一个可读,可写的文件并且后缀名为.tmp的二进制文件RandomAccessFile out = new RandomAccessFile(new File(a + "_" + index + ".tmp"), "rw");//申明具体每一文件的字节数组byte[] b = new byte[1024];int n = 0;//从指定位置读取文件字节流in.seek(begin);//判断文件流读取的边界while(in.getFilePointer() <= end && (n = in.read(b)) != -1){//从指定每一份文件的范围,写入不同的文件out.write(b, 0, n);}//定义当前读取文件的指针endPointer = in.getFilePointer();//关闭输入流in.close();//关闭输出流out.close();} catch (Exception e) {e.printStackTrace();}return endPointer;}/*** 文件合并* @param file 指定合并文件* @param tempFile 分割前的文件名* @param tempCount 文件个数*/public static void merge(String file,String tempFile,int tempCount) {String a=tempFile.split(".jpg")[0];RandomAccessFile raf = null;try {//申明随机读取文件RandomAccessFileraf = new RandomAccessFile(new File(file), "rw");//开始合并文件,对应切片的二进制文件for (int i = 0; i < tempCount; i++) {//读取切片文件RandomAccessFile reader = new RandomAccessFile(new File(a + "_" + i + ".tmp"), "r");byte[] b = new byte[1024];int n = 0;//先读后写while ((n = reader.read(b)) != -1) {//读raf.write(b, 0, n);//写}}} catch (Exception e) {e.printStackTrace();} finally {try {raf.close();} catch (IOException e) {e.printStackTrace();}}}}

上面是运行后完整的代码。

下面就说说我遇到坑,也怪我不细心

在分割文件的方法中,将两个条件弄反了,导致丢失一般的数据

上面是正确的截图

将两个条件反过来之后

结果是:

原因就是:

            while(in.getFilePointer() <= end && (n = in.read(b)) != -1){while( (n = in.read(b)) != -1&&in.getFilePointer() <= end){

上面是数据的指针是从零开始的

而下面的数据指针是从in读过之后的位置开始的,就是上面与下面的数据指针位置相差一个之前定义的byte数组长度个长度,这就是我测试是,数据丢失的原因

--------------------- 本文来自 YG青松 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_38553333/article/details/80435392?utm_source=copy

java工具类之大文件分片(切割)与合并相关推荐

  1. java实现对大文件切割下载_Java实现大文件的切割与合并操作示例

    Java实现大文件的切割与合并操作示例 发布时间:2020-09-27 02:25:08 来源:脚本之家 阅读:99 作者:HiBoyljw 本文实例讲述了Java实现大文件的切割与合并操作.分享给大 ...

  2. java实现大文件分片上传功能(前后端都有,代码down下来配置完后可以直接运行)

    问题 项目解决的问题主要是java实现分片上传功能,问题描述: 楼主在公司最近项目中使用multipart文件上传视频文件到服务器上,然后用fastdfs保存到数据库中.发现当上传的视频文件太大的时候 ...

  3. java实现大文件分片上传

    java实现大文件分片上传 在项目中用到了大文件上传功能,最初从网上参考了一些代码来实现,但是最终的上传效果不是很好,速度比较慢. 之前的上传思路是: 前端利用webUploader分片大文件 后端接 ...

  4. java实现把一个大文件切割成N个固定大小的文件

    这个好像是我一年前去面试时的一道面试题,分享一下!考 java I/O 的! //java实现把一个大文件切割成N个固定大小的文件 package com.johnny.test; import ja ...

  5. java工具类获取文件扩展名与content-type、http与content-type映射关系

    java工具类获取文件扩展名与content-type.http与content-type映射关系 大家好,我是酷酷的韩~ 一.对应关系参考地址: http://doc.chacuo.net/cont ...

  6. 【Java工具类】(22)—服务器传文件工具类SCp和Sftp

    Java工具类(22)-服务器传文件工具类SCp和Sftp 1.Scp package com.awifi.capacity.docker.manager.utils;import ch.ethz.s ...

  7. 大文件分片上传前后端实现

    最近在做公司的视频业务,涉及到大视频的上传. 之前的图片.Excel等上传做的很简单,直接表单提交后端用MultipartFile接收保存到磁盘就行了. 但是针对大文件的上传,需要做额外的处理,否则可 ...

  8. AWS-S3通用存储操作,操作minio、oss、cos等所有兼容s3协议的云存储(含有大文件分片上传实现)

    一.介绍 通用存储操作common包,支持所有兼容amazon-s3协议的云存储,如minio.oss.cos等,以后客户用啥云储存一套代码都能搞定了,真棒~ 二.代码结构 三.代码实现 3.1 po ...

  9. JAVA 实现多线程下载大文件

    JAVA 实现多线程下载大文件 开发中遇到一个问题,下载大文件到本地,导致等待时间过长,然后就寻找一个可以多线程下载的办法,受下载软件启发,想到多线程下载, 原理,首先查到这个文件的大小,然后根据线程 ...

最新文章

  1. win10 64位SSDT函数索引动态查找
  2. boost::endian模块实现conversion的测试程序
  3. mysql启动错误1.69,MySQL无法启动例一
  4. ubunut16.04解决网速慢的办法
  5. unity android屏幕自适应,Android应用开发之unity打开移动摄像头,并自适应屏幕显示摄像头数据。兼容android和ios...
  6. lighttpd安装_如何在Ubuntu服务器上安装Lighttpd
  7. 动态规划时间复杂度_算法分析与设计之动态规划
  8. 基本地图加载完整示例
  9. zookeeper 分布式锁_详细讲解!从秒杀聊到ZooKeeper分布式锁
  10. java导论pdf下载,操作系统导论 PDF 下载
  11. mysql添加索引报错1170 -BLOB/TEXT column ‘xx‘ used in key specification without a key length分析及解决
  12. 降噪耳机买什么牌子好?口碑质量好的降噪耳机推荐
  13. 刚闪电入门了树莓派:斩获不止Python,Linux,goLang,还有架构,格局...
  14. 计算机科学终审多长时间,一些计算机科学核心期刊的投稿经验
  15. 三角形计算c语言代码,C语言计算三角形面积代码
  16. 职工考勤管理MySQL课程设计_考勤管理系统数据库课程设计.doc
  17. 狡猾的商人(带权并查集)
  18. 微信小程序解决微信模板消息发送之form表单中有多个submit 按钮
  19. 恢复损坏硬盘的mysql数据
  20. 使用 Rust 语言开发 Erlang NIF

热门文章

  1. 三极管放大电路的三种接法(转)
  2. php实现试看功能,据说是视频试看功能的js代码,共享给大家,POSCMS,CodeIgniter技术文档,PHP开发文档,迅睿CMS框架官方教程...
  3. spring事务的失效
  4. 如何将3D文件(solidworks等工具导出的STL/DAE文件)在Web浏览器中加载展示
  5. 可视化读书笔记(一)
  6. C陷阱与缺陷(一)词法“陷阱”、语法“陷阱”
  7. VUE非父子组件之间通信的几种方式
  8. linux系统创建用户,并赋予管理员权限
  9. 抄书——最优化的理论与方法(4)——数学基础(秩一校正)
  10. 树洞程序php,树洞表白墙程序