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的文件 ,分 ...
随机推荐
- Q_OBJECT宏的作用
The Q_OBJECT macro at the beginning of the class definition is necessary for all classes that define ...
- cocos进阶教程(3)Lua加密技术
如果开发者不想让游戏中的资源或脚本文件轻易的暴露给其他人,一般会采用对文件进行加密的方式来保护文件或资源被盗用.Quick-Cocos2d-x 为开发者提供了xxtea加密算法,用来对脚本文件及资源进 ...
- 系统管理命令之w
区别于who命令,w命令不仅可以看到登录服务器的用户信息,而且可以看到这些用户做了什么 1.查看该命令的帮助信息. # w --help 2.查看该命令的版本信息. # w --version 3 ...
- Vue学习笔记之Vue的对象单体模式
0x00 对象的单体模式 为了解决箭头函数this指向的问题 推出来一种写法 对象的单体模式 var person = { name:'小马哥', age:12, fav(){ console.log ...
- 第二章 第二个spring-boot程序
上一节的代码是spring-boot的入门程序,也是官方文档上的一个程序.这一节会引入spring-boot官方文档推荐的方式来开发代码,并引入我们在spring开发中service层等的调用. 1. ...
- LeetCode——Rotate Image
1. Question You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees ( ...
- [笔记] SQL性能优化 - 常用语句(二)
1.查询CPU开销大的语句 total_worker_time/execution_count AS avg_cpu_cost, plan_handle, execution_count, ( , ( ...
- POJ 2528 Mayor's posters(线段树染色问题+离散化)
http://poj.org/problem?id=2528 题意: 给出一面无限长的墙,现在往墙上依次贴海报,问最后还能看见多少张海报. 题意:这道题目就相当于对x轴染色,然后计算出最后还能看见多少 ...
- bzoj2463: [中山市选2009]谁能赢呢? 博弈
小明和小红经常玩一个博弈游戏.给定一个n×n的棋盘,一个石头被放在棋盘的左上角.他们轮流移动石头.每一回合,选手只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的格子之前不能被访问过.谁不能 ...
- UVA-10600 ACM Contest and Blackout (次小生成树)
题目大意:给一张无向图,找出最小生成树和次小生成树. 题目分析:模板题...方法就是枚举所有的比最小生成树中两端点之间的最长边还要长的边,用它替换,再取一个最小的值便是次小生成树了. 代码如下: # ...