我常常遇到这个问题,由于某个小说文件太大,用手机看的时候就感觉加载很慢,想把一个长篇小说分成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);
}
}
}
}
}
|
|