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

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

一、切割文件

* 切割文件,按大小切割
* 把被切割的文件名和切割成的文件碎片数以键值对的形式写在配置文件中,
* 这要用到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. 32Sql数据库的插入

    上一节讲了数据库的连接,本例直接将数据库的插入操作,重点还是QSqlQuery类 QSqlQuery query; //新建二维表 query.exec("CREATE TABLE stud ...

  2. hdu1199 线段树

    这题说的是给了 n 个操作. 每个操作会把 [a,b] 之间的球 涂为黑色或者 白色, 然后最后问 最长的连续的白色的 球有多少个,初始的时候全是黑的. 我们将所有的点离散化, 记得离散 a-1, b ...

  3. JDBC 连接Oracle 数据库,JDBC 连接Mysql 数据库

    首先是JDBC 连接Oracle  数据库 package com.util; import com.pojo.UserInfo; import java.sql.*; public class DB ...

  4. js正则表达式的使用详解

    本文转自:http://www.jb51.net/article/39623.htm 1定义正则表达式2关于验证的三个这则表达式方法3正则表达式式的转义字符 1定义正则表达式在js中定义正则表达式很简 ...

  5. sqlite的事务和锁,很透彻的讲解 【转】

    原文:sqlite的事务和锁 http://3y.uu456.com/bp-877d38906bec097sf46se240-1.html 事务 事务定义了一组SQL命令的边界,这组命令或者作为一个整 ...

  6. python 中读取yaml

    YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便. YAML在python语言中有PyYAML安装包. YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类 ...

  7. Kali视频学习21-25

    Kali视频学习21-25 (21)密码攻击之在线攻击工具 一.cewl可以通过爬行网站获取关键信息创建一个密码字典. 二.CAT (Cisco-Auditing-Tool)很小的安全审计工具,扫描C ...

  8. 怎样绕开QQ通讯录和360的广播中断

    http://www.eoeandroid.com/thread-148381-1-1.html 最近在网上搜索怎样绕开QQ通讯录和360的广播中断,在它们之前拿到短信,结果很遗憾没有搜索到什么东西, ...

  9. c++ 判断list是否为空(empty)

    #include <list> #include <iostream> using namespace std; int main() { list<int> nu ...

  10. python 日期的减法

    from datetime import date a = date(,,) b = date(,,) print(b-a)