有时候一个视频文件或系统文件太大了,上传和下载可能会受到限制,这时可以用文件切割器把文件按大小切分为文件碎片,

等到要使用这个文件了,再把文件碎片合并成原来的文件即可。下面的代码实现了文件切割和文件合并功能。

一、切割文件

* 切割文件,按大小切割
* 把被切割的文件名和切割成的文件碎片数以键值对的形式写在配置文件中,
* 这要用到Properties集合
* 以便文件合并时可以读取并使用这些信息

 public class SplitTest {

     private static final int SIZE = 1024*1024;
public static void main(String[] args) throws IOException {
File file=new File("F:\\background.bmp");
splitFile(file);
}
public static void splitFile(File file) throws IOException{
//建立字节读取流
FileInputStream fis=new FileInputStream(file);
byte[] buf=new byte[SIZE];//建立1M的缓冲区
//建立碎片文件,所要放入的路径
File dir=new File("F:\\partFiles");
if(!dir.exists()){//目录不存在
dir.mkdirs();//则创建
}
//建立字节写入流
FileOutputStream fos=null;
int len=0;
int count=1;
while((len=fis.read(buf))!=-1){//从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
//在某些输入可用之前,此方法将阻塞。
fos=new FileOutputStream(new File(dir,(count++)+".part"));
fos.write(buf, 0, len);//将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
fos.close();
}
//把切割信息存储到配置文件中
fos=new FileOutputStream(new File(dir,count+".properties"));
Properties prop=new Properties();
prop.setProperty("partCount", (count-1)+"");
prop.setProperty("fileName", file.getName());
prop.store(fos, "split info in file");
fis.close();
fos.close();
}
}

二、合并文件

 //合并文件
public class MergeFileTest { public static void main(String[] args) throws IOException {
File dir=new File("F:\\partFiles");
mergeFiles(dir);
}
public static void mergeFiles(File file) throws IOException{
//从配置文件中获取信息
//先做健壮性判断 判断配置文件数量是否正确
File[] files=file.listFiles(new SuffixFilter(".properties"));
if(files.length!=1){
throw new RuntimeException("当前目录下没有配置文件或者配置文件不唯一");
}
//获取信息
File configFile=files[0];//获取配置文件对象
Properties prop=new Properties();
FileInputStream fis=new FileInputStream(configFile);
prop.load(fis); String fileName=prop.getProperty("fileName");
int count=Integer.parseInt(prop.getProperty("partCount")); //判断此目录下的文件碎片数是否正确
File[] partFiles=file.listFiles(new SuffixFilter(".part"));
if(partFiles.length!=count){
throw new RuntimeException("文件碎片数不正确,请重新下载");
} ArrayList<FileInputStream> al=new ArrayList<FileInputStream>();
//把读取流添加到集合中去
for(int i=0;i<count;i++){
al.add(new FileInputStream( partFiles[i]));
}
Enumeration<FileInputStream> en=Collections.enumeration(al);
//建立序列流
SequenceInputStream sis=new SequenceInputStream(en); //建立写入流
FileOutputStream fos=new FileOutputStream(new File(file,fileName));
byte[] buf=new byte[1024];
int len=0;
while((len=sis.read(buf))!=-1){
fos.write(buf, 0, len);
}
sis.close();
fos.close();
}
}
 public class SuffixFilter implements FilenameFilter {
private String suffix;
public SuffixFilter(String suffix) {
super();
this.suffix = suffix;
}
@Override
public boolean accept(File arg0, String arg1) {
// TODO Auto-generated method stub
return arg1.endsWith(suffix);
} }

不足之处:

1.没有图形化界面,不好操作。

2.应该把细化一些小的功能写成方法,而不是都写在一个大的方法中。

IO综合练习--文件切割和文件合并的更多相关文章

  1. Linux下的文件切割和文件合并

    linux下文件分割可以通过split命令来实现,可以指定按行数分割和按大小分割两种模式.Linux下文件合并可以通过cat命令来实现. 在Linux下用split进行文件分割: ①:指定分割后文件行 ...

  2. IO流(SequenceInputStream序列流--文件拆分与合并)

    一.文件拆分 1.将一个文件按照规定的大小进行分割成多个文件并将被分割详细信息保存至配置信息中 Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载,属性列表 ...

  3. split命令:文件切割

    split命令:文件切割 有时候文件过大,导致不能正常使用,可以用split进行切割. 命令参数: split [选项] [要切割的文件] [输出文件名前缀] -a, --suffix-length= ...

  4. IO流_文件切割与合并(带配置信息)

    在切割文件的时候应该生成一个记录文件信息的文件,以便在以后合并文件的时候知道这个文件原来的文件名和记录文件切割完后生成了多少个切割文件 import java.io.File; import java ...

  5. java下io文件切割合并功能加配置文件

    package cn.stat.p1.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...

  6. java下io文件切割合并功能

    package cn.stat.p1.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...

  7. Java---练习:文件切割与合并(1)

    实现对大文件的切割与合并. 按指定个数切(如把一个文件切成10份)或按指定大小切(如每份最大不超过10M),这两种方式都可以. 示例程序说明: 文件切割:把一个文件切割成多个碎片,每个碎片的大小不超过 ...

  8. java IO流之文件切割两例(含Properties 用法)

    package cn.itcast.io.p1.splitfile; import java.io.File;import java.io.FileInputStream;import java.io ...

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

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

随机推荐

  1. django需要了解的

    搞得差不多就去看看类和对象,看看oop是什么,多用lambda,学学md5加密. 你应当了解,django不是服务器,只提供服务.因此,学习nginx.或是apache是必要的.(IIS不了解,不过题 ...

  2. 常微分方程初值问题:多步预测-修正方法 [MATLAB]

    #先上代码后补笔记# #可以直接复制粘贴调用的MATLAB函数代码!# 1. 亚当斯(Adams)预测-修正算法 由亚当斯-巴什福特(Adams-Bashforth)显式预测公式和亚当斯-莫顿(Ada ...

  3. JavaScript Ajax上传文件miniupload.js

    用到jquery和layer.js (function ($) { $.fn.miniupload = function (options, callback) { var jqDom = $(thi ...

  4. And Design:拓荒笔记——Form表单

    And Design:拓荒笔记——Form表单 Form.create(options) Form.create()可以对包含Form表单的组件进行改造升级,会返回一个新的react组件. 经 For ...

  5. jQuery中的prop和attr区别

    最近在做一个项目用jq时发现一个问题  在谷歌中可以正常出效果  但是在火狐中就是不行 就是这个prop和attr   之前用的是attr方法   但是在火狐中不出效果  于是特意看了两者的区别 主要 ...

  6. 报错org.openqa.selenium.WebDriverException: disconnected: unable to connect to renderer解决方法

    做自动化时经常会遇到不兼容的问题,比如以下简单的脚本,主要是打开浏览器,然后最大化窗口,打开百度,输入内容搜索,代码如下: package com.gs.selenium; import org.op ...

  7. 通过自动回复机器人学Mybatis:MySQL脚本 + db >> dao >> service >> servlet

    留着参考 makeData.sql delimiter // create procedure make_data() begin declare i int ; do insert into mes ...

  8. pyDay16

    内容来自廖雪峰的官方网站. 1.Python内建的filter()函数用于过滤序列. 2.和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函数 ...

  9. phpstorm2016.1 添加对Drupal的编程支持

    一.前言 phpstorm作为目前对drupal支持最好的开发工具之一,是drupal模块开发的首选工具.今天我就来谈谈最新的phpstorm如何添加对drupal模块的支持. 相关环境:操作系统ub ...

  10. 【eclipse】查看jar乱码问题解决