分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

  原来觉得文件的切割与合并好神秘,觉得能够写这样程序的人简直就是高手、老鸟之类的人了,呵呵。

  现在我自己这么一写,才觉得是如此之简单,连我这都菜鸟都能够写(不过,还是花了我将近半天的时间,呵呵),看来只要是人都能够写了。

  暂时不懂,没有关系,好好拿去看一下。主要涉及的知识也没有几个,无非就是文件输入输出流、随机文件的读写之类的。其它的就是循环,很简单的,有兴趣的就看看。

  只有两个文件:Separator.java(文件分割)、Combination.java(文件合并)。

Separator.java(文件分割):

import java.io.File;
import java.io.FileOutputStream;
import java.io.RandomAccessFile;

/**
 * 文件分隔器:给定文件的路径和每一块要拆分的大小,就可以按要求拆分文件
 * 如果指定的块给原文件都还要大,为了不动原文件,就生成另一个文件,以.bak为后缀,这样可以保证原文件
 * 如果是程序自动拆分为多个文件,那么后缀分别为".part序号",这样就可以方便文件的合并了
 * 原理:很简单,就是利用是输入输出流,加上随机文件读取。
 */
public class Separator
{
  String FileName=null;//原文件名
  long FileSize=0;//原文件的大小
  long BlockNum=0;//可分的块数
  public Separator()
  {
  }
  /**
   *
   * @param fileAndPath 原文件名及路径
   */
  private void getFileAttribute(String fileAndPath)//取得原文件的属性
  {
    File file=new File(fileAndPath);
    FileName=file.getName();
    FileSize=file.length();
  }
  /**
   *
   * @param blockSize 每一块的大小
   * @return 能够分得的块数
   */
  private long getBlockNum(long blockSize)//取得分块数
  {
    long fileSize=FileSize;
    if(fileSize<=blockSize)//如果分块的小小只够分一个块
      return 1;
    else
    {
      if(fileSize%blockSize>0)
      {
        return fileSize/blockSize+1;
      }
      else
        return fileSize/blockSize;
    }
  }
  /**
   *
   * @param fileAndPath 原文件及完整路径
   * @param currentBlock 当前块的序号
   * @return 现在拆分后块的文件名
   */
  private String generateSeparatorFileName(String fileAndPath,int currentBlock)//生成折分后的文件名,以便于将来合将
  {
    return fileAndPath+".part"+currentBlock;
  }
  /**
   *
   * @param fileAndPath 原文件及完整路径
   * @param fileSeparateName 文件分隔后要生成的文件名,与原文件在同一个目录下
   * @param blockSize 当前块要写的字节数
   * @param beginPos 从原文件的什么地方开始读取
   * @return true为写入成功,false为写入失败
   */
  private boolean writeFile(String fileAndPath,String fileSeparateName,long blockSize,long beginPos)//往硬盘写文件
  {
 
    RandomAccessFile raf=null;
    FileOutputStream fos=null;
    byte[] bt=new byte[1024];
    long writeByte=0;
    int len=0;
    try
    {
      raf = new RandomAccessFile(fileAndPath,"r");
      raf.seek(beginPos);
      fos = new FileOutputStream(fileSeparateName);
      while((len=raf.read(bt))>0)
      {       
        if(writeByte<blockSize)//如果当前块还没有写满
        {
          writeByte=writeByte+len;
          if(writeByte<=blockSize)
            fos.write(bt,0,len);
          else
          {
            len=len-(int)(writeByte-blockSize);
            fos.write(bt,0,len);
          }
        }       
      }
      fos.close();
      raf.close();
    }
    catch (Exception e)
    {
      e.printStackTrace();
      try
      {
        if(fos!=null)
          fos.close();
        if(raf!=null)
          raf.close();
      }
      catch(Exception f)
      {
        f.printStackTrace();
      }
      return false;
    }
    return true;
  }
  /**
   *
   * @param fileAndPath 原文路径及文件名
   * @param blockSize 要拆分的每一块的大小
   * @return true为拆分成功,false为拆分失败
   */
  private boolean separatorFile(String fileAndPath,long blockSize)//折分文件主函数
  {
    getFileAttribute(fileAndPath);//将文件的名及大小属性取出来
    //System.out.println("FileSize:"+FileSize);
    //System.out.println("blockSize:"+blockSize);
    BlockNum=getBlockNum(blockSize);//取得分块总数
    //System.out.println("BlockNum:"+BlockNum);
    //System.exit(0);
    if(BlockNum==1)//如果只能够分一块,就一次性写入
      blockSize=FileSize;
    long writeSize=0;//每次写入的字节
    long writeTotal=0;//已经写了的字节
    String FileCurrentNameAndPath=null;
    for(int i=1;i<=BlockNum;i++)
    {
      if(i<BlockNum)
        writeSize=blockSize;//取得每一次要写入的文件大小
      else
        writeSize=FileSize-writeTotal;
      if(BlockNum==1)
        FileCurrentNameAndPath=fileAndPath+".bak";
      else
        FileCurrentNameAndPath=generateSeparatorFileName(fileAndPath,i);
      //System.out.print("本次写入:"+writeSize);     
      if(!writeFile(fileAndPath,FileCurrentNameAndPath,writeSize,writeTotal))//循环往硬盘写文件
        return false;
      writeTotal=writeTotal+writeSize;
      //System.out.println("  总共写入:"+writeTotal);
    }
    return true;
  }
  public static void main(String[] args)
  {
    Separator separator = new Separator();
    String fileAndPath="d://test.rar";//文件名及路径
    long blockSize=200*1024;//每一个文件块的大小,大小是按字节计算
    if(separator.separatorFile(fileAndPath,blockSize))
    {
      System.out.println("文件折分成功!");
    }
    else
    {
      System.out.println("文件折分失败!");
    }
     
  }
}

Combination.java(文件合并):

/**
 * 合并文件:合并由拆分文件拆分的文件
 * 要求将拆分文件放到一个文件夹中
 * 主要利用随机文件读取和文件输入输出流
 */
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.RandomAccessFile;

import java.util.Arrays;
import java.util.StringTokenizer;

public class Combination
{
  String srcDirectory=null;//拆分文件存放的目录
  String[] separatedFiles;//存放所有拆分文件名
  String[][] separatedFilesAndSize;//存放所有拆分文件名及分件大小
  int FileNum=0;//确定文件个数
  String fileRealName="";//据拆分文件名确定现在原文件名
  public Combination()
  {
    srcDirectory="d://test//";
  }
  /**
   *
   * @param sFileName 任一一个拆分文件名
   * @return 原文件名
   */
  private String getRealName(String sFileName)
  {
    StringTokenizer st=new StringTokenizer(sFileName,".");
    return st.nextToken()+"."+st.nextToken();
  }
  /**
   * 取得指定拆分文件模块的文件大小
   * @param FileName 拆分的文件名
   * @return
   */
  private long getFileSize(String FileName)
  {
    FileName=srcDirectory+FileName;
    return (new File(FileName).length());
  }
  /**
   * 生成一些属性,做初使化
   * @param drictory 拆分文件目录
   */
  private void getFileAttribute(String drictory)
  {
    File file=new File(drictory);
    separatedFiles=new String[file.list().length];//依文件数目动态生成一维数组,只有文件名
    separatedFiles=file.list();
    //依文件数目动态生成二维数组,包括文件名和文件大小
    //第一维装文件名,第二维为该文件的字节大小
    separatedFilesAndSize=new String[separatedFiles.length][2];
    Arrays.sort(separatedFiles);//排序
    FileNum=separatedFiles.length;//当前文件夹下面有多少个文件
    for(int i=0;i<FileNum;i++)
    {
      separatedFilesAndSize[i][0]=separatedFiles[i];//文件名
      separatedFilesAndSize[i][1]=String.valueOf(getFileSize(separatedFiles[i]));//文件大上
    }
    fileRealName=getRealName(separatedFiles[FileNum-1]);//取得文件分隔前的原文件名
  }
  /**
   * 合并文件:利用随机文件读写
   * @return true为成功合并文件
   */
  private boolean CombFile()
  {
    RandomAccessFile raf=null;
    long alreadyWrite=0;
    FileInputStream fis=null;
    int len=0;
    byte[] bt=new byte[1024];
    try
    {
      raf = new RandomAccessFile(srcDirectory+fileRealName,"rw");
      for(int i=0;i<FileNum;i++)
      {
        raf.seek(alreadyWrite);
        fis=new FileInputStream(srcDirectory+separatedFilesAndSize[i][0]);
        while((len=fis.read(bt))>0)
        {
          raf.write(bt,0,len);
        }
        fis.close();
        alreadyWrite=alreadyWrite+Long.parseLong(separatedFilesAndSize[i][1]);
      }
      raf.close();     
    }
    catch (Exception e)
    {
      e.printStackTrace();
      try
      {
        if(raf!=null)
          raf.close();
        if(fis!=null)
          fis.close();
      }
      catch (IOException f)
      {
        f.printStackTrace();
      }
      return false;
    }
    return true;
  }
  public static void main(String[] args)
  {
    Combination combination = new Combination();   
    combination.getFileAttribute(combination.srcDirectory);
    combination.CombFile();
    System.exit(0);
  }
}

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

JAVA写的文件分割与文件合并程序相关推荐

  1. sand java_我在sand用java写了一个读取wifi密码的程序,该方法由主方法调用,运行没问题,效果也正常,...

    我在sand用java写了一个读取wifi密码的程序,该方法由主方法调用,运行没问题,效果也正常,就是无法连续调用,就是如果调用一次就退出然后再运行就可以,如果用完了,再主方法里选择... 我在san ...

  2. Java实现文件分割和文件合并实例

    文件切割和文件合并这个问题困扰了我有一段时间了(超过一天没做粗来). 找了好多博客,本来想转载一个来的 结果找不到了.很无奈. 只好自己贴代码上了. 当然我会尽力好好写注释的. 文件切割器: impo ...

  3. java实现文件合并_Java实现文件分割和文件合并实例

    文件切割和文件合并这个问题困扰了我有一段时间了(超过一天没做粗来). 找了好多博客,本来想转载一个来的 结果找不到了.很无奈. 只好自己贴代码上了. 当然我会尽力好好写注释的. 文件切割器: impo ...

  4. java写病毒程序代码_一个用JAVA写的清除EXE病毒文件的程序(转)

    Clear.java 这是一个主类,主要是负责运行程序和参数检查,不是核心 程序代码: import java.io.*; public class Clear{ public static void ...

  5. Java写一个简单的静态文件的HTTP服务器(基于Socket)

    ** 一.实现思路 ** 1.使用 ServerSocket 监听某一端口,然后等待连接获取 Socket对象. 2.创建一个类 HttpServer 继承 java.lang.Thread 类,重写 ...

  6. java写一个简单的浪漫代码_程序员的浪漫弹窗表白,圣诞节给Ta惊喜吧(附源码,简单易学哦)...

    不要以为程序员都是木讷的,浪漫起来也会让很多妹子心动的.而程序员的表白方式也很不一般,通过一堆代码,无限释放浪漫.今天教给大家通过改写脚本语言,利用弹窗可充分自由发挥,用来表白或者恶搞都是不错的选择. ...

  7. java按键发出声音代码_用Java写的一个根据按键发声的程序,为什么只有前16次按键响...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 public void sound(int tone){ try { sequencer = MidiSystem.getSequencer(); seq ...

  8. java切割文件_Java实现按行分割大文件

    简介 工作的时候,需要将一个大的文本文件按行分割成几个小文件.本来懒得写,想网上copy一下得了,但是 gLoLdchFGpoogle 了一遍,找了几个代码写的有点乱,尝试了之后发现效率太慢了,一个 ...

  9. 今天写了一个含配置文件的 文件分割 及 合并 的java程序。

    SplitFileDemo(分割)类 package Split;import java.io.File; import java.io.FileInputStream; import java.io ...

最新文章

  1. 这老哥把GPU当暖气用,省钱了!
  2. 「SAP技术」MIGO 343 解冻物料库存的同时可以更改存储地点
  3. Oracle加入Eclipse MicroProfile项目
  4. Windows 8让程序员们忧心忡忡
  5. power计算机英语,十万火急求解计算机英语!AC power lineAND gateAND-OR circuitXOR gateunrel...
  6. 课堂作业_什么是图灵测试
  7. LeetCode 775. 全局倒置与局部倒置(归并排序/二分查找/一次遍历)
  8. 太真实了!程序员之间的鄙视链...
  9. 机器学习11/100天-KNN实践
  10. 周爱民:真正的架构师是没有title的(图灵访谈)
  11. Android 6.0权限分组
  12. 数据库减压--php+mysql+memcached模拟nosql
  13. python数学实验与建模_Python数学
  14. Android对话框_详解
  15. 人机交互-语音交互的优势和劣势
  16. Port-A-Thon
  17. logging日志带颜色
  18. egret实现微信排行榜功能 (2018-8-20)
  19. Visual Studio2022快速生成函数说明文档
  20. opencv3/C++ 机器学习-决策树/DTrees

热门文章

  1. 我是一个请求,我该何去何从
  2. MySQL事务处理特性的实现原理
  3. 从零开始学python | 什么是Python JSON?
  4. Spring Boot 从1.0 升级到 2.0 所踩的坑
  5. Robin负载均衡策略存在问题及CSE解决方案
  6. 一统江湖的大前端(2)—— Mock.js + Node.js 如何与后端潇洒分手
  7. 推荐系统实战-概念理解入门篇
  8. PHP+MySql+PDO实现简单增加、删除、修改、查询
  9. crash分析 (如何确定主进程死掉的点)
  10. Android dialog中显示一个超链接