IO综合练习--文件切割和文件合并
有时候一个视频文件或系统文件太大了,上传和下载可能会受到限制,这时可以用文件切割器把文件按大小切分为文件碎片,
等到要使用这个文件了,再把文件碎片合并成原来的文件即可。下面的代码实现了文件切割和文件合并功能。
一、切割文件
* 切割文件,按大小切割
* 把被切割的文件名和切割成的文件碎片数以键值对的形式写在配置文件中,
* 这要用到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综合练习--文件切割和文件合并的更多相关文章
- Linux下的文件切割和文件合并
linux下文件分割可以通过split命令来实现,可以指定按行数分割和按大小分割两种模式.Linux下文件合并可以通过cat命令来实现. 在Linux下用split进行文件分割: ①:指定分割后文件行 ...
- IO流(SequenceInputStream序列流--文件拆分与合并)
一.文件拆分 1.将一个文件按照规定的大小进行分割成多个文件并将被分割详细信息保存至配置信息中 Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载,属性列表 ...
- split命令:文件切割
split命令:文件切割 有时候文件过大,导致不能正常使用,可以用split进行切割. 命令参数: split [选项] [要切割的文件] [输出文件名前缀] -a, --suffix-length= ...
- IO流_文件切割与合并(带配置信息)
在切割文件的时候应该生成一个记录文件信息的文件,以便在以后合并文件的时候知道这个文件原来的文件名和记录文件切割完后生成了多少个切割文件 import java.io.File; import java ...
- java下io文件切割合并功能加配置文件
package cn.stat.p1.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...
- java下io文件切割合并功能
package cn.stat.p1.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...
- Java---练习:文件切割与合并(1)
实现对大文件的切割与合并. 按指定个数切(如把一个文件切成10份)或按指定大小切(如每份最大不超过10M),这两种方式都可以. 示例程序说明: 文件切割:把一个文件切割成多个碎片,每个碎片的大小不超过 ...
- java IO流之文件切割两例(含Properties 用法)
package cn.itcast.io.p1.splitfile; import java.io.File;import java.io.FileInputStream;import java.io ...
- Java中使用IO流实现大文件的分裂与合并
文件分割应该算一个比较实用的功能,举例子说明吧比如说:你有一个3G的文件要从一台电脑Copy到另一台电脑, 但是你的存储设备(比如SD卡)只有1G ,这个时候就可以把这个文件切割成3个1G的文件 ,分 ...
随机推荐
- http webservice socket的区别
1 数据传输方式1.1 socket传输的定义和其特点 所谓socket通常也称作"套接字",实现服务器和客户端之间的物理连接,并进行数据传输,主要有udp和tcp两个协议. ...
- VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)
上一节是关于列表视图控件List Control的上半部分,简单介绍了列表视图控件,其通知消息的处理和有关结构体的定义.本节继续讲解下半部分,包括列表视图控件的创建.CListCtrl类的主要成员函数 ...
- fiddler抓包HTTPS配置及代理设置
使用fiddler抓包过程中遇到一系列的问题,浪费了大半天时间~~~写下解决办法 按照网上方法配置之后还是无法抓到cookies提示各种证书错误 1.卸载fiddler重新安装,设置 2.设置步骤 ( ...
- bzoj3629 / P4397 [JLOI2014]聪明的燕姿
P4397 [JLOI2014]聪明的燕姿 根据唯一分解定理 $n=q_{1}^{p_{1}}*q_{2}^{p_{2}}*q_{3}^{p_{3}}*......*q_{m}^{p_{m}}$ 而$ ...
- awk处理excel表格数据
拿到一个ip的excel表格,要对单元格中的ip进行扫描,一看有点乱,有空格分割的,有"/"分割的,有带括号(分割的,有好几百个: 要把左边的变为右边的格式,用excel自带的功能 ...
- vs+qt使用资源文件
1.在Resources目录新建一个.qrc文件 2.在解决方案的Resource Files中添加这个文件 3.为这个qrc添加资源,建议把资源都放进Resources
- UVA 11019 Matrix Matcher(二维hash + 尺取)题解
题意:在n*m方格中找有几个x*y矩阵. 思路:二维hash,总体思路和一维差不太多,先把每行hash,变成一维的数组,再对这个一维数组hash变成二维hash.之前还在想怎么快速把一个矩阵的hash ...
- 原生DOM操作vs框架虚拟DOM比较
1. 原生 DOM 操作 vs. 通过框架封装操作. 这是一个性能 vs. 可维护性的取舍.框架的意义在于为你掩盖底层的 DOM 操作,让你用更声明式的方式来描述你的目的,从而让你的代码更容易维护.没 ...
- Thinking in java note1
Part information collecting from http://blog.csdn.net/leonliu06/article/details/78638841 1. 如果已经定义了一 ...
- 记一次加载js不全报错的原因总结
1.运营商广告 dns 劫持2.浏览器本身并发数3.服务器配置keepAliveTimeout=04.加载文件过大5.