Java将文件分割为多个子文件再将子文件合并成原始文件的示例,废话不多说,代码如下:
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
import java.io.File;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.util.Properties;
import java.util.Iterator;
import java.util.TreeSet;
import java.util.Set;
public class Test
{
public static void main(String[] args) throws Exception
{
/*
*将一个文件分割为多个文件,然后再组合成一个文件
* 找到文件,读入一个1M的buffer中,然后写入一个Part文件中,循环此操作直到文件读取完毕
*/
String sourceFilePath = "D:" + File.separator + "Code" + File.separator + "source" + File.separator + "031316_【第13章:Java类集】_属性类:Properties.wmv" ;
int partFileLength = 1024 * 1024 ; //指定分割的子文件大小为1M
splitFile(sourceFilePath,partFileLength); //将文件分割
combineFile( "D:" + File.separator + "Code" + File.separator + "target" ); //将分割后的文件合并
}
public static void combineFile(String directoryPath) throws Exception
{
Properties config = new Properties();
InputStream ips = null ;
ips = new FileInputStream( new File(directoryPath + File.separator + "config.properties" ));
config.load(ips);
Set keySet = config.keySet(); //需要将keySet转换为int型
//将keySet迭代出来,转换成int类型的set,排序后存储进去
Set<Integer> intSet = new TreeSet<Integer>();
Iterator iterString = keySet.iterator();
while (iterString.hasNext())
{
String tempKey = (String)iterString.next();
if ( "name" .equals(tempKey))
{}
else
{
int tempInt ;
tempInt = Integer.parseInt(tempKey);
intSet.add(tempInt);
}
}
Set<Integer> sortedKeySet = new TreeSet<Integer>();
sortedKeySet.addAll(intSet);
OutputStream eachFileOutput = null ;
eachFileOutput = new FileOutputStream( new File( "D:" + File.separator + "Code" + File.separator + config.getProperty( "name" )));
Iterator iter = sortedKeySet.iterator();
while (iter.hasNext())
{
String key = new String( "" + iter.next());
if (key.equals( "name" ))
{}
else
{
//System.out.println("debug---");
String fileNumber = null ;
String filePath = null ;
fileNumber = key;
filePath = config.getProperty(fileNumber);
//循环读取文件 --> 依次写入
InputStream eachFileInput = null ;
eachFileInput = new FileInputStream( new File(filePath));
byte [] buffer = new byte [ 1024 * 1024 * 1 ]; //缓冲区文件大小为1M
int len = 0 ;
while ((len = eachFileInput.read(buffer, 0 , 1024 * 1024 * 1 )) != - 1 )
{
eachFileOutput.write(buffer, 0 ,len);
}
eachFileInput.close();
}
}
eachFileOutput.close();
}
public static void splitFile(String sourceFilePath, int partFileLength) throws Exception
{
File sourceFile = null ;
File targetFile = null ;
InputStream ips = null ;
OutputStream ops = null ;
OutputStream configOps = null ; //该文件流用于存储文件分割后的相关信息,包括分割后的每个子文件的编号和路径,以及未分割前文件名
Properties partInfo = null ; //properties用于存储文件分割的信息
byte [] buffer = null ;
int partNumber = 1 ;
sourceFile = new File(sourceFilePath); //待分割文件
ips = new FileInputStream(sourceFile); //找到读取源文件并获取输入流
configOps = new FileOutputStream( new File( "D:" + File.separator + "Code" //配置文件
+ File.separator + "target" + File.separator + "config.properties" ));
buffer = new byte [partFileLength]; //开辟缓存空间
int tempLength = 0 ;
partInfo = new Properties(); //key:1开始自动编号 value:文件路径
while ((tempLength = ips.read(buffer, 0 ,partFileLength)) != - 1 )
{
String targetFilePath = "D:" + File.separator + "Code"
+ File.separator + "target" + File.separator + "part_" + (partNumber); //分割后的文件路径+文件名
partInfo.setProperty((partNumber++)+ "" ,targetFilePath); //将相关信息存储进properties
targetFile = new File(targetFilePath);
ops = new FileOutputStream(targetFile); //分割后文件
ops.write(buffer, 0 ,tempLength); //将信息写入碎片文件
ops.close(); //关闭碎片文件
}
partInfo.setProperty( "name" ,sourceFile.getName()); //存储源文件名
partInfo.store(configOps, "ConfigFile" ); //将properties存储进实体文件中
ips.close(); //关闭源文件流
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/cqulyk/article/details/38471505