有的时候我们想要操作的文件很大,比如:我们想要上传一个大文件,但是收到上传文件大小的限制,无法上传,这是我们可以将一个大的文件分割成若干个小文件进行操作,然后再把小文件还原成源文件。分割后的每个小文件的类型可以自己定义。

一下是我编写的一个大文件的分割和合并的代码:

package com.lym;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; /**
* 1、实现一个文件分割器,把一个大文件分割成若干个小文件(可根据情况自行设计),
* 分割后的文件扩展名为dat,文件名为:原文件名+原扩展名+编号+.dat
* 2、把分割后的文件再合并(文件还原)成完整文件,与源文件一致。
* @author lym
*
*/
public class Homework2 { /**
* 文件分割
* @param src 源文件路径
* @param fileSize 分割后每个文件的大小,单位是MB
* @param dest 目标文件路径
*/
public static void split(String src,int fileSize,String dest){ if("".equals(src)||src==null||fileSize==0||"".equals(dest)||dest==null){
System.out.println("分割失败");
} File srcFile = new File(src);//源文件 long srcSize = srcFile.length();//源文件的大小
long destSize = 1024*1024*fileSize;//目标文件的大小(分割后每个文件的大小) int number = (int)(srcSize/destSize);
number = srcSize%destSize==0?number:number+1;//分割后文件的数目 String fileName = src.substring(src.lastIndexOf("\\"));//源文件名 InputStream in = null;//输入字节流
BufferedInputStream bis = null;//输入缓冲流
byte[] bytes = new byte[1024*1024];//每次读取文件的大小为1MB
int len = -1;//每次读取的长度值
try {
in = new FileInputStream(srcFile);
bis = new BufferedInputStream(in);
for(int i=0;i<number;i++){ String destName = dest+File.separator+fileName+"-"+i+".dat";
OutputStream out = new FileOutputStream(destName);
BufferedOutputStream bos = new BufferedOutputStream(out);
int count = 0;
while((len = bis.read(bytes))!=-1){
bos.write(bytes, 0, len);//把字节数据写入目标文件中
count+=len;
if(count>=destSize){
break;
}
}
bos.flush();//刷新
bos.close();
out.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭流
try {
if(bis!=null)bis.close();
if(in!=null)in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} /**
* 文件合并
* 注意:在拼接文件路劲时,一定不要忘记文件的跟路径,否则复制不成功
* @param destPath 目标目录
* @param srcPaths 源文件目录
*/
public static void merge(String destPath,String ... srcPaths){
if(destPath==null||"".equals(destPath)||srcPaths==null){
System.out.println("合并失败");
}
for (String string : srcPaths) {
if("".equals(string)||string==null)
System.out.println("合并失败");
}
//合并后的文件名
String name = srcPaths[0].substring(srcPaths[0].lastIndexOf("\\"));
String destName = name.substring(0, name.lastIndexOf("-"));
destPath = destPath+destName;//合并后的文件路径 File destFile = new File(destPath);//合并后的文件
OutputStream out = null;
BufferedOutputStream bos = null;
try {
out = new FileOutputStream(destFile);
bos = new BufferedOutputStream(out);
for (String src : srcPaths) {
File srcFile = new File(src);
InputStream in = new FileInputStream(srcFile);
BufferedInputStream bis = new BufferedInputStream(in);
byte[] bytes = new byte[1024*1024];
int len = -1;
while((len = bis.read(bytes))!=-1){
bos.write(bytes, 0, len);
}
bis.close();
in.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭流
try {
if(bos!=null)bos.close();
if(out!=null)out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
/**
* 分割测试
*/
// String src = "E:\\API\\JDK_API_1_6_zh_CN.CHM";//要分割的大文件
// int fileSize = 10;
// String dest = "D:\\";//文件分割后保存的路径
// System.out.println("分割开始。。。");
// split(src, fileSize, dest);
// System.out.println("分割完成"); /**
* 合并测试
*/
//合并后文件的保存路径
String destPath = "D:\\upan";
//要合并的文件路径
String[] srcPaths = {
"D:\\JDK_API_1_6_zh_CN.CHM-0.dat",
"D:\\JDK_API_1_6_zh_CN.CHM-1.dat",
"D:\\JDK_API_1_6_zh_CN.CHM-2.dat",
"D:\\JDK_API_1_6_zh_CN.CHM-3.dat"};
System.out.println("开始合并。。。");
merge(destPath, srcPaths);
System.out.println("合并结束");
} }

Java-使用IO流对大文件进行分割和分割后的合并的更多相关文章

  1. Java中使用IO流实现大文件的分裂与合并

    文件分割应该算一个比较实用的功能,举例子说明吧比如说:你有一个3G的文件要从一台电脑Copy到另一台电脑, 但是你的存储设备(比如SD卡)只有1G ,这个时候就可以把这个文件切割成3个1G的文件 ,分 ...

  2. Java通过IO流输入输出 向文件中存入大量三个属性的值,并通过验证前两个属性输出第三个属性

    package ABC1; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import ...

  3. java使用io流读取windows文件乱码问题

    出现原因: 在IDEA中,使用 FileReader 读取项目中的文本文件.由于IDEA的设置,都是默认的 UTF-8 编码,所以没有任何 问题. 但是,当读取Windows系统中创建的文本文件时,由 ...

  4. Java使用IO流读取TXT文件

    通过BufferedReader读取TXT文件window系统默认的编码是GBK,而IDE的编码多数为UTF-8,如果没有规定new InputStreamReader(new FileInputSt ...

  5. Java基础-IO流对象之随机访问文件(RandomAccessFile)

    Java基础-IO流对象之随机访问文件(RandomAccessFile) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.RandomAccessFile简介 此类的实例支持对 ...

  6. Java基础——IO流

    今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...

  7. JAVA中IO流总结

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42119261 我想你对JAVA的IO流有所了解,平时使用的 ...

  8. Java基础IO流(二)字节流小案例

    JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...

  9. Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream)

    Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我们学习字 ...

随机推荐

  1. QT开发之旅四邮件发送工具

    终于有了一个晚上安静的写写程序,最近一直忙着公司商务上的事情,一直想用QT实现一个调用最底层socket通信来实现的邮件发送程序,以前用C#写过,微软都封装好的,不知道底层是如何实现的,只知道调用方法 ...

  2. python tkinter教程-事件绑定

    一个Tkinter主要跑在mainloop进程里.Events可能来自多个地方,比如按键,鼠标,或是系统事件. Tkinter提供了丰富的方法来处理这些事件.对于每一个控件Widget,你都可以为其绑 ...

  3. UITableView 如何设置背景颜色

    http://blog.sina.com.cn/s/blog_6734cee201011kya.html 原因:1.backgroundView 属性不为nil,所有设置backgroundColor ...

  4. Android.mk(5) 计算怎么办?

    https://www.jianshu.com/p/57c01e97c9b8 计算怎么办? 前面我们把Makefile做为一门语言的主要特性大致做了一个描述,它集合了目标式的模式和函数式的模式,还有大 ...

  5. 使用MSBUILD 构建时出错 error MSB3086: 任务未能使用 SdkToolsPath“”或注册表项“XXX”找到“LC.exe”,请确保已设置 SdkToolsPath。

    如果项目有添加有WB引用,比如引用其它网站的WEB服务等,那么VS在编译时会自动生成个 [项目名称].Serializers.dll的文件,就是把引用服务中的相关对象信息生成硬编码的程序集,以提高效率 ...

  6. 第三步 Cordova 3.0(及以上版本) 添加插件

    1.使用命令生成项目 例:cordova create jy110 com.example.jy110 jy110 2.使用命令添加插件(如果报错,可能是网络问题,可以多试几次,直到成功) 例:cor ...

  7. nginx(一)----ubuntu14.04下安装nginx

    /** * lihaibo * 文章内容都是根据自己工作情况实践得出. *如有错误,请指正 *转载请注明出处 */ 此文章中用到的软件下载地址: 链接: http://pan.baidu.com/s/ ...

  8. 【JSP】JSP的介绍和基本原理

    JSP简介 JSP的核心实质是Servlet技术.JSP是后来添加的基于Servlet的一种扩展技术.但二者在使用上有不同的方向. 由于Servlet实质是一个Java类,因此非常适合用来处理业务逻辑 ...

  9. 【CF708E】Student's Camp 组合数+动态规划

    [CF708E]Student's Camp 题意:有一个n*m的网格,每一秒钟,所有左面没有格子的格子会有p的概率消失,右面没有格子的格子也会有p的概率消失,问你t秒钟后,整个网格的上边界和下边界仍 ...

  10. Making Promises With

    转:Making Promises With http://www.htmlgoodies.com/beyond/javascript/making-promises-with-jquery-defe ...