package com.zhjy.function.storeHouse;
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.InputStream;
import java.io.OutputStream;
/**
* 1、实现一个文件分割器,把一个大文件分割成若干个小文件(可根据情况自行设计),
* 分割后的文件扩展名为dat,文件名为:原文件名+原扩展名+编号+.dat
* 2、把分割后的文件再合并(文件还原)成完整文件,与源文件一致。
* @author lym
*
*/
public class Homework2 {
/**
* 文件分割
* @param src 源文件路径
* @param fileSize 分割后每个文件的大小,单位是MB
* @param dest 目标文件路径
*/
public static void split(String src,int fileSize,String dest){
if("".equals(src)||src==null||fileSize==0||"".equals(dest)||dest==null){
System.out.println("分割失败");
}
File srcFile = new File(src);//源文件
long srcSize = srcFile.length();//源文件的大小
long destSize = 1024*1024*fileSize;//目标文件的大小(分割后每个文件的大小)
int number = (int)(srcSize/destSize);
number = srcSize%destSize==0?number:number+1;//分割后文件的数目
String fileName = src.substring(src.lastIndexOf("\\"));//源文件名
InputStream in = null;//输入字节流
BufferedInputStream bis = null;//输入缓冲流
byte[] bytes = new byte[1024*1024];//每次读取文件的大小为1MB
int len = -1;//每次读取的长度值
try {
in = new FileInputStream(srcFile);
bis = new BufferedInputStream(in);
for(int i=0;i<number;i++){
String destName = dest+File.separator+fileName+"-"+i+".sql";
OutputStream out = new FileOutputStream(destName);
BufferedOutputStream bos = new BufferedOutputStream(out);
int count = 0;
while((len = bis.read(bytes))!=-1){
bos.write(bytes, 0, len);//把字节数据写入目标文件中
count+=len;
if(count>=destSize){
break;
}
}
bos.flush();//刷新
bos.close();
out.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭流
try {
if(bis!=null)bis.close();
if(in!=null)in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 文件合并
* 注意:在拼接文件路劲时,一定不要忘记文件的跟路径,否则复制不成功
* @param destPath 目标目录
* @param srcPaths 源文件目录
*/
public static void merge(String destPath,String ... srcPaths){
if(destPath==null||"".equals(destPath)||srcPaths==null){
System.out.println("合并失败");
}
for (String string : srcPaths) {
if("".equals(string)||string==null)
System.out.println("合并失败");
}
//合并后的文件名
String name = srcPaths[0].substring(srcPaths[0].lastIndexOf("\\"));
String destName = name.substring(0, name.lastIndexOf("-"));
destPath = destPath+destName;//合并后的文件路径
File destFile = new File(destPath);//合并后的文件
OutputStream out = null;
BufferedOutputStream bos = null;
try {
out = new FileOutputStream(destFile);
bos = new BufferedOutputStream(out);
for (String src : srcPaths) {
File srcFile = new File(src);
InputStream in = new FileInputStream(srcFile);
BufferedInputStream bis = new BufferedInputStream(in);
byte[] bytes = new byte[1024*1024];
int len = -1;
while((len = bis.read(bytes))!=-1){
bos.write(bytes, 0, len);
}
bis.close();
in.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭流
try {
if(bos!=null)bos.close();
if(out!=null)out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
/**
* 分割测试
*/
//String src = "E:\\API\\JDK_API_1_6_zh_CN.CHM";//要分割的大文件
String src = "D:\\用户目录\\我的音乐\\wjwzhbgmh.sql";//要分割的大文件
int fileSize = 100;
String dest = "F:\\大sql";//文件分割后保存的路径
System.out.println("分割开始。。。");
split(src, fileSize, dest);
System.out.println("分割完成");
/**
* 合并测试
*/
// 合并后文件的保存路径
// String destPath = "D:\\upan";
// 要合并的文件路径
// String[] srcPaths = {
// "D:\\JDK_API_1_6_zh_CN.CHM-0.dat",
// "D:\\JDK_API_1_6_zh_CN.CHM-1.dat",
// "D:\\JDK_API_1_6_zh_CN.CHM-2.dat",
// "D:\\JDK_API_1_6_zh_CN.CHM-3.dat"};
// System.out.println("开始合并。。。");
// merge(destPath, srcPaths);
// System.out.println("合并结束");
}
}
package com.zhjy.function.storeHouse;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
public class pidefile {
public static final String SUFFIX = ".sql"; // 分割后的文件名后缀
// 将指定的文件按着给定的文件的字节数进行分割文件,其中name指的是需要进行分割的文件名,size指的是指定的小文件的大小
public static String[] pide(String name, long size) throws Exception {
File file = new File(name);
if (!file.exists() || (!file.isFile())) {
throw new Exception("指定文件不存在!");
}
// 获得被分割文件父文件,将来被分割成的小文件便存在这个目录下
File parentFile = file.getParentFile();
// 取得文件的大小
long fileLength = file.length();
System.out.println("文件大小:" + fileLength + " 字节");
if (size <= 0) {
size = fileLength / 2;
}
// 取得被分割后的小文件的数目
int num = (fileLength % size != 0) ? (int) (fileLength / size + 1)
: (int) (fileLength / size);
// 存放被分割后的小文件名
String[] fileNames = new String[num];
// 输入文件流,即被分割的文件
FileInputStream in = new FileInputStream(file);
// 读输入文件流的开始和结束下标
long end = 0;
int begin = 0;
// 根据要分割的数目输出文件
for (int i = 0; i < num; i++) {
// 对于前num - 1个小文件,大小都为指定的size
File outFile = new File(parentFile, file.getName() + i + SUFFIX);
// 构建小文件的输出流
FileOutputStream out = new FileOutputStream(outFile);
// 将结束下标后移size
end += size;
end = (end > fileLength) ? fileLength : end;
// 从输入流中读取字节存储到输出流中
for (; begin < end; begin++) {
out.write(in.read());
}
out.close();
fileNames[i] = outFile.getAbsolutePath();
}
in.close();
return fileNames;
}
public static void readFileMessage(String fileName) {// 将分割成的小文件中的内容读出
File file = new File(fileName);
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
String string = null;
// 按行读取内容,直到读入null则表示读取文件结束
while ((string = reader.readLine()) != null) {
System.out.println(string);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
}
}
public static void main(final String[] args) throws Exception {
//String name = "G:/ad.tar/ad/ad_samples.dat";
String name = "D:/用户目录/我的音乐/wjwzhbgmh.sql";
long size = 1024 * 1024 * 4;// 1K=1024b(字节)
String[] fileNames = pidefile.pide(name, size);
System.out.println("文件" + name + "分割的结果如下:");
for (int i = 0; i < fileNames.length; i++) {
System.out.println(fileNames[i] + "的内容如下:");
// FenGeFile.readFileMessage(fileNames[i]);
System.out.println();
}
}
}