本文实例讲述了java实现大文件的切割与合并操作。分享给大家供大家参考,具体如下:
这里实现对大文件的切割与合并。
按指定个数切(如把一个文件切成10份)或按指定大小切(如每份最大不超过10m),这两种方式都可以。
在这里我只是给大家写下我自己的一点简单的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
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程序设计有所帮助。
原文链接:https://blog.csdn.net/hiboyljw/article/details/47428607