A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangpengyong 中级黑马   /  2014-9-25 16:14  /  1211 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我常常遇到这个问题,由于某个小说文件太大,用手机看的时候就感觉加载很慢,想把一个长篇小说分成5份,10份这样子,看起来也方便,比如一个小说为<三国演义> 共计10M,现在分成5个小文件,分成为三国演义1.txt,三国演义2....直到 三国演义5.txt 每个文件大概2M,这样看起来比较方便. 绝无参考其他代码,java源代码如下:
运行效果:文件分割器效果图[img][/img]

恳求各位大神给予改进, 使得对任意类型文件都好使

源代码如下;

package fileOperation;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.StringTokenizer;

public class FilePartition {

/**
   * @describe 拆分文件
   * @author wpy 2014-9-20
   */
  public static void main(String[] args) throws IOException {
   // 需要指定的参数
   File file = new File("E:\\Test\\明朝那些事儿.txt");// 源文件目录
   int filenumber = 5; // 拆分成文件的个数

  long startTime = System.currentTimeMillis();
   BufferedReader br = new BufferedReader(new FileReader(file));
   StringBuffer sb = new StringBuffer();// 读入的字符暂存到String
   String lineContent = null; // 读到的当前行
   String filename = file.getName();
   String filepath = file.getParent();
   String subfilename = "";
   String subfilepath = "";

  subfilepath = filepath.replace('\\', '/') + "/"
     + filename.substring(0, filename.length() - 4);// 注意反斜杠的转义
   File newpath = new File(subfilepath);

  if (newpath.exists())
    deleteAllFile(newpath.getAbsolutePath());// 删除文件下所有
   else
    newpath.mkdirs(); // 生成filename这个文件夹 把子文件都放入这个文件

  // 统计总共行数
   long linecount = 0;
   // br.mark(65535);//标记流的位置
   while ((lineContent = br.readLine()) != null) {
    linecount++;
   }
   // br.reset();//回到标记位
   br.close();
   br = new BufferedReader(new FileReader(file));
   long everyfilereadline = linecount / filenumber;
   String filenames[] = new String[filenumber];

  // 子文件名字数组
   for (int i = 0; i < filenumber; i++) {
    subfilename = subfilepath + "/"
      + filename.substring(0, filename.length() - 4) + (i + 1)
      + ".txt";
    subfilename = subfilename.replace('\\', '/');
    filenames = subfilename;
   }

  long nowline = 0;
   int nowfilenumber = 0;
   PrintWriter pw;
   pw = new PrintWriter(filenames[0]);// 第一个子文件
   System.out.println("\ncreate  file :"+filenames[0]);
   while ((lineContent = br.readLine()) != null) {
    if (nowline == everyfilereadline) {
     nowline = 0;// 行数清零
     pw.write(sb.toString());
     pw.close();

    // 生成下一个子文件
     sb = new StringBuffer();
     nowfilenumber++;// 当前文件数+1
     if (nowfilenumber < filenumber) {
      System.out.println("create  file :"+filenames[nowfilenumber]);
      pw = new PrintWriter(filenames[nowfilenumber]);// 由于开始是在上次的基础上加1
     }
    }

   // 注意 分隔符不能在原文中有 否则copy不正确 最好找个外文字符
    StringTokenizer st = new StringTokenizer(lineContent, "ほ");
    for (int t = 0; st.hasMoreElements(); t++) {
     String word = (String) st.nextElement();
     sb.append(word);
    }
    sb.append("\r\n");// 回车并换行 \n是不行的
    nowline++;
   }
   if (pw != null) {
    pw.write(sb.toString());// 写入最后一个文件
    pw.close();
   }
   br.close();

  long endTime = System.currentTimeMillis();
   System.out.println("共用时 :" + convertTime(endTime - startTime));

}

public static String convertTime(Long time) {
   long hour = time / 1000 / 60 / 60;
   long seconds = time / 1000 % 60;
   long minute = time / 1000 / 60 % 60;
   long millisecond = time % 1000;

  return hour + ":" + minute + ":" + seconds + ":" + millisecond;

}

public static void deleteAllFile(String delpath) {// 删除文件或者文件夹下所有文件
   File file = new File(delpath);
   if (file.isFile()) {
    file.delete();
   } else if (file.isDirectory()) {
    String[] filelist = file.list();
    for (int i = 0; i < filelist.length; i++) {
     File delfile = new File(delpath + "\\" + filelist);
     System.out.println("delete original File =" + delfile.getName());
     if (delfile.isFile()) {
      delfile.delete();
     } else if (delfile.isDirectory()) {
      deleteAllFile(delpath + "\\" + filelist);
     }
    }
   }
  }

}





2 个回复

倒序浏览
查看效果图
回复 使用道具 举报
C:\Users\wangpengyong\Desktop
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马