Java文件拆分与合并

来源:互联网 发布:优化储存空间照片恢复 编辑:程序博客网 时间:2024/05/18 22:17

思路:用字节流把文件拆分,然后用序列流合并字节流。

练习:文件切割与合并

实现对大文件的切割与合并。按指定个数切(如把一个文件切成10份)或按指定大小切(如每份最大不超过10M),这两种方式都可以。

示例程序说明:

1)文件切割:把一个文件切割成多个碎片,每个碎片的大小不超过1M。自己可把功能进一步扩展:切割前的文件名、长度,切割后的碎片个数、文件名等信息可写到第一个碎片中或另外用properties把这些写到配置文件中。
2)文件合并:这里简单假设已知被合并目录的File对象和原文件的名字。其实这些完全可以做成活的,如把这些信息保存在碎片文件或配置文件,也可以同样用文件选择对话框来读取用户的选择。

代码实现:

package outIn2.fileCutAndMerge;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.SequenceInputStream;import java.util.Enumeration;import java.util.Vector;/* * 1)学习切割文件 * 2)合并文件 */public class Test2 {/* * crossLine-切割线 */static int crossLine = 1024;static String newFileName = "Tetris";public static void main(String[] args) {// test1();test2();}/* * 合并文件 */private static void test2() {/* * 先得到需要合并文件的数量, * 然后合并。 */File f = new File("d:/ex/a/test1");File[] files = null;if (f.isDirectory()) {files = f.listFiles();}String[] strs = new String[files.length];for (int i = 0; i < strs.length; i++) {strs[i] = files[i].getName();}BufferedInputStream[] bins = new BufferedInputStream[files.length];Vector<BufferedInputStream> v = new Vector<BufferedInputStream>();BufferedOutputStream bout = null;try {for (int i = 0; i < bins.length; i++) {bins[i] = new BufferedInputStream(new FileInputStream("d:/ex/a/test1/" + strs[i]));v.add(bins[i]);}Enumeration<BufferedInputStream> en = v.elements();SequenceInputStream sin = new SequenceInputStream(en);int len = 0;byte[] buf = new byte[1024];bout = new BufferedOutputStream(new FileOutputStream("d:/ex/a/test2/Tetris_Successful.zip"));while ((len = sin.read(buf)) != -1) {bout.write(buf, 0, len);}bout.flush();} catch (IOException e) {e.printStackTrace();} finally {for (int i = 0; i < bins.length; i++) {if (bins != null) {try {bins[i].close();} catch (IOException e) {e.printStackTrace();}}}if (bout != null) {try {bout.close();} catch (IOException e) {e.printStackTrace();}}}}/* * 拆分文件 */public static void test1() {// FileInputStream fin = null;// FileOutputStream fout = null;BufferedInputStream bin = null;BufferedOutputStream bout = null;try {bin = new BufferedInputStream(new FileInputStream("d:/ex/a/Tetris0.zip"));bout = new BufferedOutputStream(new FileOutputStream("d:/ex/a/test1/Tetris1.zip"));/* * 一次搬1KB的数据。 */int count = 0;int len = 0;int num = 2;byte[] buf = new byte[1024];while ((len = bin.read(buf)) != -1) {/* * 写入新文件 */bout.write(buf, 0, len);count++;if (count >= crossLine) {bout.close();bout = new BufferedOutputStream(new FileOutputStream("d:/ex/a/test1/Tetris" + num + ".zip"));num++;count = 0;}if (num >= 45) {break;}}} catch (IOException e) {e.printStackTrace();} finally {if (bin != null) {try {bin.close();} catch (IOException e) {e.printStackTrace();}}if (bout != null) {try {bout.close();} catch (IOException e) {e.printStackTrace();}}}}}






这个文件是myeclipse项目,有包名。


0 0