Java实现大文件的切割与合并操作示例

 更新时间:2018年07月02日 09:21:50   作者:HiBoyljw  
这篇文章主要介绍了Java实现大文件的切割与合并操作,结合实例形式分析了java基于io及util操作大文件按指定个数分割与合并相关操作技巧,需要的朋友可以参考下

本文实例讲述了Java实现大文件的切割与合并操作。分享给大家供大家参考,具体如下:

这里实现对大文件的切割与合并。

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

在这里我只是给大家写下我自己的一点简单的代码:

package io2;
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.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import javax.swing.JFileChooser;
public class FileSplitDemo {
/**
* 实现对大文件的切割与合并。 按指定个数切(如把一个文件切成10份)或按指定大小切(如每份最大不超过10M),这两种方式都可以。
*/
public static void main(String[] args) {
JFileChooser jfc = new JFileChooser();// Swing中的选择文件
// 选择文件
int result = jfc.showOpenDialog(null);// 显示框架用于选择文件
File file = null;// 要切割的文件
File dest = null;// 目的地文件
try {
if (result == JFileChooser.APPROVE_OPTION) {// 选中文件
// 切割文件
file = jfc.getSelectedFile();// 用户选择的文件
dest = new File(file.getParent(), "spliFile");
cutingFile(file, dest);// 切割方法
// 2合并(运行时,直接对刚才切割的那些文件碎片进行合并)
String fileName = file.getName();
mergeDemo(dest, fileName);// 合并文件
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void mergeDemo(File dest, String fileName)
throws IOException {
// 健壮性防护(用File对象去开道)
if (!dest.exists()) {
throw new RuntimeException("文件不存在");
}
// 用一个文件数组将里面的文件都装起来
File parth[] = dest.listFiles();// 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
if (parth.length == 0) {
throw new RuntimeException("碎片不存在");
}
// y用序列流来合并
ArrayList<FileInputStream> list = new ArrayList<FileInputStream>();
// for (int i = 0; i < parth.length; i++) {
// list.add(new FileInputStream(parth[i]));//不能这样,这样合并出来的文件是顺序乱的
// }
for (int i = 0; i < parth.length; i++) {
list.add(new FileInputStream(new File(dest, fileName + (i + 1)
+ "part")));// 套接技术,文件加的顺序要和原文件一样
}
// 枚举对象接口
Enumeration<FileInputStream> en = Collections.enumeration(list);
SequenceInputStream sq = new SequenceInputStream(en);
// 写入到新文件中
FileOutputStream fou = new FileOutputStream(new File(dest, fileName));
byte buf[] = new byte[1024];
sq.read(buf);
int len = 0;
while ((len = sq.read(buf)) > 0) {
fou.write(buf, 0, len);
}
fou.close();
sq.close();
}
private static void cutingFile(File source, File dest) {
// 切割
try {
FileInputStream fis = new FileInputStream(source);
if (!dest.exists()) {// 文件操作IO流要判断文件是否存在。
dest.mkdir();
}
byte buf[] = new byte[1024 * 1024];// 1M
fis.read(buf);
int len = 0;
int cout = 1;
while ((len = fis.read(buf)) != -1) {
// 用OUT流来切割文件
FileOutputStream fout = new FileOutputStream(new File(dest,
source.getName() + (cout++) + "part"));
fout.write(buf, 0, len);
fout.close();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

文件切割:把一个文件切割成多个碎片,每个碎片的大小不超过1M。自己可把功能进一步扩展:切割前的文件名、长度,切割后的碎片个数、文件名等信息可写到第一个碎片中或另外用properties把这些写到配置文件中。

文件合并:这里简单假设已知被合并目录的File对象和原文件的名字。其实这些完全可以做成活的,如把这些信息保存在碎片文件或配置文件,也可以同样用文件选择对话框来读取用户的选择。

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • URL @PathVariable 变量的匹配原理分析

    URL @PathVariable 变量的匹配原理分析

    这篇文章主要介绍了URL @PathVariable 变量的匹配原理分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java面试JDK8 new ReentrantLock()加锁流程解析

    java面试JDK8 new ReentrantLock()加锁流程解析

    这篇文章主要为大家介绍了java面试JDK8 new ReentrantLock()加锁流程解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java中的日期和时间类以及Calendar类用法详解

    Java中的日期和时间类以及Calendar类用法详解

    这篇文章主要介绍了Java中的日期和时间类以及Calendar类用法详解,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • 浅析打开eclipse出现Incompatible JVM的解决方法

    浅析打开eclipse出现Incompatible JVM的解决方法

    本篇文章是对打开eclipse出现Incompatible JVM的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • SpringBoot项目找不到javax.servlet.Filter的问题及解决

    SpringBoot项目找不到javax.servlet.Filter的问题及解决

    这篇文章主要介绍了SpringBoot项目找不到javax.servlet.Filter的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • JVM实战系列之CPU100%和内存100%排查

    JVM实战系列之CPU100%和内存100%排查

    本文主要介绍了JVM实战系列之CPU100%和内存100%排查,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 深入理解Spring注解@Async解决异步调用问题

    深入理解Spring注解@Async解决异步调用问题

    这篇文章主要介绍了深入理解Spring注解@Async解决异步调用问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • java中的BlockingQueue(阻塞队列)解析

    java中的BlockingQueue(阻塞队列)解析

    这篇文章主要介绍了java中的BlockingQueue阻塞队列解析,阻塞队列是一个支持两个附加操作的队列,这两个附加的操作是,在队列为空时,获取元素的线程会等待队列变为非空,需要的朋友可以参考下
    2023-12-12
  • Java实用小技能之快速创建List常用几种方式

    Java实用小技能之快速创建List常用几种方式

    java集合可以说无论是面试、刷题还是工作中都是非常常用的,下面这篇文章主要给大家介绍了关于Java实用小技能之快速创建List常用的几种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • 如何构建可重复读取inputStream的request

    如何构建可重复读取inputStream的request

    这篇文章主要介绍了如何构建可重复读取inputStream的request,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论