用Java实现文件分割/合并操作

来源:互联网 发布:真人rpg游戏发展数据 编辑:程序博客网 时间:2024/04/30 08:31

package org.glpt.file;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.sql.Timestamp;
import java.util.Arrays;

public class SmallToBig {

 private String newFileName;// 新文件名字

 private String filterName;// 过滤规则名字

 private String oldFileName;// 老文件名字

 public SmallToBig(String oldFileName, String newFileName, String filterName) {
  this.newFileName = newFileName;

  this.filterName = filterName;

  this.oldFileName = oldFileName;
 }

 public void unite() {
  Timestamp startTime = null; // 获得系统的开始时间
  Timestamp endTime = null; // 获得系统的结束时间
  startTime = new Timestamp(System.currentTimeMillis());
  String[] fileNameTemp;
  File inFile = new File("F://workspace//glpt//database//temporaryfiles"); //临时文件所在的目录
  File outFile = new File(newFileName); // 取得输出文件的名字
  RandomAccessFile outt = null;
  byte[] bytes = new byte[2048];
  try {
   outt = new RandomAccessFile("F://workspace//glpt//database//data//"
     + outFile, "rw");
   // 取得符合条件的文件名
   fileNameTemp = inFile.list(new FilenameFilter() {
    public boolean accept(File dir, String name) {
     System.out.println("dir = " + dir);
     System.out.println("name = " + name);
     String rr = new File(name).toString();
     return rr.endsWith(filterName);
    }
   });
   Arrays.sort(fileNameTemp);// 对文件名排序
   // 打开所有的文件再写入到一个文件里
   for (int i = 0; i < fileNameTemp.length; i++) {
    for (int j = 0; j < fileNameTemp.length; j++) {
     if (fileNameTemp[j].equals(oldFileName + i + filterName)) {
      System.out.println(fileNameTemp[j]);// 顺序打印写入目标文件的文件名
      inFile = new File(fileNameTemp[j]);
      RandomAccessFile inn = new RandomAccessFile(
        "F://workspace//glpt//database//temporaryfiles//"
          + inFile, "r");//临时文件所在的位置
      int len;   //写入的长度
      while ((len = inn.read(bytes)) != -1) {
       outt.write(bytes, 0, len);//每次写入bytes量
       outt.skipBytes(len);//按顺序写入
      }
      inn.close();
     }
    }
   }
   outt.close();
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   if (outt != null)
    try {
     outt.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   // *********************测试***********************
   endTime = new Timestamp(System.currentTimeMillis());
   System.out.println("开始时间:" + startTime.toString());
   System.out.println("结束时间:" + endTime.toString());
   long ss = endTime.getTime() - startTime.getTime();
   System.out.println("共用时间:" + ss / 1000.0 + "s");
   // ***********************************************

  }
 }

}

package org.glpt.file;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.sql.Timestamp;

 

public class BigToSmall {

 String fileName; // 分割文件的文件名

 int size; // 每份的大小

 private String lastname;// 临时文件后缀

 public BigToSmall(String fileName, String size, String lastname) {

  this.fileName = fileName;

  this.size = Integer.parseInt(size) * 1024;// 转换成M

  this.lastname = lastname;
 }

 public void cut() {

  Timestamp startTime = null; // 获得系统的开始时间
  Timestamp endTime = null; // 获得系统的结束时间
  startTime = new Timestamp(System.currentTimeMillis());
  File inFile = new File(fileName);
  long fileLength = inFile.length(); // 取得文件的大小
  System.out
    .println("Size of file = " + fileLength / 1024.0 / 1024 + "M");
  System.out.println("Name of File = " + inFile.getName());

  long fileNumber; // 取得要分割的个数
  RandomAccessFile inn = null;

  try {
   inn = new RandomAccessFile(inFile, "r");
   // 打开要分割的文件
   long filePartCount = fileLength / size;
   fileNumber = (fileLength % size) == 0 ? filePartCount
     : (filePartCount + 1);
   int i = 0;
   int j = 0;

   byte[] bytes = new byte[size * 10];// 缓存
   // 根据要分割的数目输出文件
   for (; j < fileNumber; j++) {
    File outFile = new File(
      "F://workspace//glpt//database//temporaryfiles//"
        + inFile.getName() + j + lastname);
    RandomAccessFile outt = new RandomAccessFile(outFile, "rw");

    for (i = 0; i < size;) {
     int len = inn.read(bytes);
     if (len == -1) {
      break;
     }
     outt.write(bytes, 0, len);
     i = i + len;
    }
    outt.close();// 关闭文件流
   }

   inn.close();// 关闭文件流
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   if (inn != null)
    try {
     inn.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   // ********************测试***********************
   System.out.println("每份文件大小:" + size / 1024.0 / 1024 + "M");
   endTime = new Timestamp(System.currentTimeMillis());
   System.out.println("开始时间:" + startTime.toString());
   System.out.println("结束时间:" + endTime.toString());
   long ss = endTime.getTime() - startTime.getTime();
   System.out.println("共用时间:" + ss / 1000.0 + "s");
   // ***********************************************
  }
 }

}

package org.glpt.file;

import org.glpt.file.SmallToBig;
import org.glpt.file.BigToSmall;

public class ActionOfFile {
 private SmallToBig smalltoBig; //引用SmallToBig类,实现合并

 private BigToSmall bigtoSmall;//引用BigToSmall类,实现分割

 public ActionOfFile() {
 }

 public void smallToBig(String oldFileName,String newFileName,String filterName) {
  smalltoBig = new SmallToBig(oldFileName,newFileName, filterName);
  smalltoBig.unite();//合并

 }

 public void bigToSmall(String fileName, String size,String lastname) {
  bigtoSmall = new BigToSmall(fileName, size,lastname);
  bigtoSmall.cut();//分割

 }