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

 import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties; public class SplitFileDemo {
private static final int SIZE = 1024*1024;//1M=1024*1024个字节 public static void main(String[] args) throws IOException {
File file = new File("F:\\jian.avi");
splitFileDemo(file); }
public static void splitFileDemo(File file) throws IOException { //用读取流关联一个文件
FileInputStream fis = new FileInputStream(file); //定义一个1M的缓冲区
byte[] buf = new byte[SIZE]; //创建目的
FileOutputStream fos = null;
int count = 1;
int len = 0;
/*
* 切割文件时,必须记录被切割文件的名称,以及切割出来碎片文件的个数,以便于合并
* 这个信息为了进行简单的描述,使用键值对的方式,用到了properties对象
* properties
* */
Properties prop = new Properties(); File dir = new File("F:\\partfiles");
if(!dir.exists()){
dir.mkdirs();
} while((len = fis.read(buf))!=-1){
fos = new FileOutputStream(new File(dir,(count++)+".part"));//扩展名可以依据软件的需求来定义,但不要是txt这些扩展名,因为切割完的文件不能直接读取
fos.write(buf,0,len);
fos.close();
}
//将被切割文件的信息保存到prop集合中
prop.setProperty("partcount", count+"");
prop.setProperty("filesname", file.getName());
fos = new FileOutputStream(new File(dir,count+".properties"));
//将prop集合中的数据存储到文件中
prop.store(fos, "save file info"); fos.close();
fis.close();
}
}

文件合并(将被切割了的文件合并回去)

  先定义一个过滤器:

import java.io.File;
import java.io.FilenameFilter; public class suffixFilter implements FilenameFilter {
private String suffix;
public suffixFilter(String suffix) {
super();
this.suffix = suffix;
}
@Override
public boolean accept(File dir, String name) {
return name.endsWith(suffix);
}
}
 import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Properties; public class MergeFile { public static void main(String[] args) throws IOException {
File dir = new File("F:\\partfiles");
mergeFile(dir); }
public static void mergeFile(File dir) throws IOException{ //先拿取保存文件信息的那个配置文件对象============================
File[] files = dir.listFiles(new suffixFilter(".properties"));//这里要过滤文件
if(files.length!=1){
throw new RuntimeException(dir+",该目录下没有properties扩展名的文件或者不唯一");
} //记录配置文件对象
File confile = files[0]; //获取该文件中的信息=================================================
Properties prop = new Properties();
FileInputStream fis = new FileInputStream(confile);
prop.load(fis); String filename = prop.getProperty("filesname");
int count = Integer.parseInt(prop.getProperty("partcount")); //获取该目录下的所有碎片文件==========================================
File[] partFiles = dir.listFiles(new suffixFilter(".part"));
if(partFiles.length!=(count-1)){
throw new RuntimeException("碎片文件不符合要求,个数应该是"+count+"个");
} //将碎片文件和流对象关联并存储到集合中=========================================
ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
for (int i = 0; i < partFiles.length; i++) {
al.add(new FileInputStream(partFiles[i]));
} //将多个流合并为一个序列流=================================
Enumeration<FileInputStream> en = Collections.enumeration(al); SequenceInputStream sis = new SequenceInputStream(en); FileOutputStream fos = new FileOutputStream(new File(dir,filename));
byte[] buf = new byte[1024];
int len = 0;
while((len=sis.read(buf))!=-1){
fos.write(buf,0,len);
} sis.close();
fos.close();
} }

IO流_文件切割与合并(带配置信息)的更多相关文章

  1. IO流_文件切割与合并

    切割可以分两种方式:按文件个数切,按文件大小来切(建议用这种方式,因为按个数的话,有可能文件非常大) import java.io.File; import java.io.FileInputStre ...

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

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

  3. java 后台通过IO流把文件传到前端并下载

    我的业务需求是两个不同的web程序放在不同的服务器上,web程序A要访问到web程序B上传上来的文件,所以用到了这一个IO读取文件的接口 JAVA代码(排版有点问题  已经尽力补救了(:3_ヽ)_) ...

  4. Java:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  5. java io流 对文件夹的操作

    java io流 对文件夹的操作 检查文件夹是否存在 显示文件夹下面的文件 ....更多方法参考 http://www.cnblogs.com/phpyangbo/p/5965781.html ,与文 ...

  6. java io流 创建文件、写入数据、设置输出位置

    java io流 创建文件 写入数据 改变system.out.print的输出位置 //创建文件 //写入数据 //改变system.out.print的输出位置 import java.io.*; ...

  7. IO流----操作文件的9种方法代码实现

    IO流----操作文件的9种方法代码实现: 1:使用字节流读写数据: 四种方式: method1:          每次读写一个字节,边读边写: /* * 复制文本文件. * * 数据源:从哪里来 ...

  8. 38、使用IO流进行文件拷贝

    使用IO流进行文件拷贝 需求:在项目的根目录里面创建一个java.txt的文件,然后将这个文件拷贝到file文件夹里面并且重命名为good.txt文件先以流的方式将java.txt文件读取到内存中,然 ...

  9. Java基础教程:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

随机推荐

  1. lucene-solr源码编译导入eclipse--转

    https://www.jianshu.com/p/8a217ce05475 github地址:https://github.com/apache/lucene-solr 第一步:git clone ...

  2. C# ABP源码详解 之 BackgroundJob,后台工作(一)

    本文归属作者所有,转发请注明本文链接. 1. 前言 ABP的BackgroundJob,用来处理耗时的操作.比如客户端上传文件,我们要把文件(Excel)做处理,这耗时的操作我们应该放到后台工作者去做 ...

  3. 将不确定变为确定~老赵写的CodeTimer是代码性能测试的利器

    首先,非常感谢赵老大的CodeTimer,它让我们更好的了解到代码执行的性能,从而可以让我们从性能的角度来考虑问题,有些东西可能我们认为是这样的,但经理测试并非如何,这正应了我之前的那名话:“机器最能 ...

  4. 菜鸟入门【ASP.NET Core】10:Cookie-based认证实现

    准备工作 新建MVC项目,然后用VSCode打开 dotnet new mvc --name MvcCookieAuthSample 在Controllers文件夹下新建AdminController ...

  5. [PHP] 算法-复制复杂链表的PHP实现

    复杂链表的复制: 1.在旧链表中每个结点的后面复制出一个结点,隔代 2.把旧链表的随机指向部分,复制到新添加的结点上 3.把新结点从旧链表中拆分出来成新链表 1. linklist=head whil ...

  6. eclipse中安装windowbuilder插件、应用及卸载

    一.安装windowbuilder插件 1.找到对应版本的windowbuilder 连接地址:http://www.eclipse.org/windowbuilder/download.php 如图 ...

  7. java错误分析之junit测试错误(实验一)

    本文转自:https://www.cnblogs.com/anny0404/p/5275595.html 在原作者的基础上进行部分添加,也很感谢原作者这篇博文,帮我分析与解决问题! 原文: 下载了最新 ...

  8. 微信跳一跳Python辅助无需配置一键操作

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/8350329.html 邮箱:moyi@moyib ...

  9. Python全栈学习_day004作业

    ,写代码,有如下列表,按照要求实现每一个功能 li = ["alex", "WuSir", "ritian", "barry&qu ...

  10. 关于input的焦点事件

    关于input的焦点事件 $(".scanf_integral").focus(function(){//获取焦点//获取焦点后触发的事件 }) $(".scanf_in ...