java 拆分文件
- 声明:本人小白,记录日常瞎写,欢迎大神指导学习,勿喷。
- 使用场景:某个文件数据比较多,但是需要拆分成多份,手动拆有点太浪费时间,所以写了一个小脚本。
- 步骤:
- 1、通过键盘输入的方式获取要拆分的文件
- 2、去做一些简单的校验,比如是否为空,是否存在
- 3、 通过键盘输入的方式获取要拆分的文件个数
- 4、创建一个文件夹用来存放拆分后的文件,为了防止文件夹重复用了System. currentTimeMillis,返回的是当前时间,以毫秒为单位
- 5、获取文件总行数,得到每个文件用过存多少行(我的做法是:只取商,整除不开多余的放在最后一个文件中),拿到文件的后缀 (txt、csv这种后缀)
- 6、拼接文件,读一行写一行,如果不是最后一个文件,且读到了上面得到的每个文件应存的行数的时候就结束这个文件的写入开始下一个
- 7、整体代码
- 8、windows bat文件
声明:本人小白,记录日常瞎写,欢迎大神指导学习,勿喷。
使用场景:某个文件数据比较多,但是需要拆分成多份,手动拆有点太浪费时间,所以写了一个小脚本。
思路:
- 拿到文件,最做一些简单的检验,在拿到要拆分的数量
- 得到文件的总行数,除以要拆分的个数,得到每个文件应该存多少行,不能整除多余出来的数据放到最后一个文件中
- 一行一行读取,先写第一个文件,写到了应该写入的行数,结束 写下一个
- 如果经常需要拆分文件,Windows可以写个bat,双击就可以运行程序
把代码放在一个 txt中,然后另存为 .java的时候 注意选编码格式为 ASCII
先javac FIleSplit.java 生成 .class 文件
.bat 中写入 java FIleSplit (timeout /nobreak /t 10 是为了不让程序结束的太快看不见提示信息)
(需要把 .class 和 .bat 放在同一目录)}
效果:
步骤:
1、通过键盘输入的方式获取要拆分的文件
System.out.print("请输入要分割的文件的绝对路径 (例如:D:\\\\1.txt):");
filePath = new Scanner(System.in).next();
2、去做一些简单的校验,比如是否为空,是否存在
if (file.length()/1024 > 0){
System.out.printf("文件大小为:%d KB。\n",file.length()/1024);
}else if (file.length()/1024 == 0 & count > 0){
System.out.println("文件小于 1 KB。");
}else if (!file.isFile()){
System.out.println("不是可拆分文件或文件不存在,无法拆分!");
return;
}else if (count == 0){
System.out.println("文件为空,无法拆分!");
return;
}
3、 通过键盘输入的方式获取要拆分的文件个数
System.out.print("请输入拆分个数:");
splitNumber = new Scanner(System.in).nextInt();
while (true){
if (splitNumber <= 0){
System.out.print("输入不合法,请重新输入:");
splitNumber = new Scanner(System.in).nextInt();
}else {
break;
}
}
4、创建一个文件夹用来存放拆分后的文件,为了防止文件夹重复用了System. currentTimeMillis,返回的是当前时间,以毫秒为单位
File files = new File(filePath);
//Windows路径 示例 D:\\1.txt
//String folder = files. getParent()+"\\"+files. getName()+"_"+System. currentTimeMillis ();
//拼接 mac下的 路径
String folder = files.getParent()+"/"+files.getName().split("\\.")[0]+"_"+System. currentTimeMillis();
//创建文件夹
new File(folder) .mkdirs();
5、获取文件总行数,得到每个文件用过存多少行(我的做法是:只取商,整除不开多余的放在最后一个文件中),拿到文件的后缀 (txt、csv这种后缀)
//获取文件的总行数
int count = (int)Files.lines(Paths .get(filePath)).count();
//每个文件的行数
int every_count = (count/splitNumber);
String file_name = files.getName().split("\\.")[0];
//分割交件后缀
String name_suffix = files.getName().split("\\.")[1];
6、拼接文件,读一行写一行,如果不是最后一个文件,且读到了上面得到的每个文件应存的行数的时候就结束这个文件的写入开始下一个
//按行读取文件
LineNumberReader lineNumberReader = new LineNumberReader(new FileReader(filePath)) ;
//用来记录读取到了第几行
int len = 1;
Long start_time = System.currentTimeMillis();
String name_folder = null;
for (int i = 1; i <= splitNumber; i++){
//拼接完整的绝对路径
name_folder = folder + "/" + file_name + "_"+ i + "." + name_suffix;
FileWriter fileWriter = new FileWriter(name_folder);
System.out.println("开始写入 "+name_folder);
while (len <= count){
String s = lineNumberReader.readLine();
//如果是最后一行 就不换行了
if (len == count){
fileWriter.write(s);
//不是最行一行的时候 需要换行,要不就都写成了一行
}else {
fileWriter.write(s+"\n");
}
// 不是最后一个文件,且 len 等于每个文件应该写入的行数后,就结束 开始写下一文件
if (i != splitNumber & len == i*every_count){
len++;
break;
}else if (len == count){
break;
}
len++;
}
fileWriter.close();
}
System.out.println();
System.out.printf("拆分后的文件保存于 %s \n",folder );
long end_time = System.currentTimeMillis();
System.out.printf("\n拆分结束,耗时:%d 毫秒。",(end_time-start_time));
7、整体代码
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;
public class FIleSplit {
private static String filePath;
private static int splitNumber;
public static void main(String[] args) throws IOException {
verify();
}
public static void verify() throws IOException {
System.out.print("请输入要分割的文件的绝对路径 (例如:D:\\\\1.txt):");
filePath = new Scanner(System.in).next();
File file = new File(filePath);
int count = (int)Files.lines(Paths.get(filePath)).count();
if (file.length()/1024 > 0){
System.out.printf("文件大小为:%d KB。\n",file.length()/1024);
}else if (file.length()/1024 == 0 & count > 0){
System.out.println("文件小于 1 KB。");
}else if (!file.isFile()){
System.out.println("不是可拆分文件或文件不存在,无法拆分!");
return;
}else if (count == 0){
System.out.println("文件为空,无法拆分!");
return;
}
System.out.print("请输入拆分个数:");
splitNumber = new Scanner(System.in).nextInt();
while (true){
if (splitNumber <= 0){
System.out.print("输入不合法,请重新输入:");
splitNumber = new Scanner(System.in).nextInt();
}else {
break;
}
}
System.out.println();
split(filePath,splitNumber);
}
public static void split(String filePath,int splitNumber) throws IOException {
File files = new File(filePath);
//Windows路径 示例D:\\1.txt
//String folder = files. getParent()+"\\"+files. getName()+"_"+System. currentTimeMillis ();
//拼接 mac下的 路径
String folder = files.getParent()+"/"+files.getName().split("\\.")[0]+"_"+System. currentTimeMillis ();
//创建文件夹
new File(folder) .mkdirs();
//获取文件的总行数
int count = (int)Files.lines(Paths .get(filePath)).count();
//每个文件的行数
int every_count = (count/splitNumber);
String file_name = files.getName().split("\\.")[0];
//分割交件后缀
String name_suffix = files.getName().split("\\.")[1];
//按行读取文件
LineNumberReader lineNumberReader = new LineNumberReader(new FileReader(filePath)) ;
int len = 1;
Long start_time = System.currentTimeMillis();
String name_folder = null;
for (int i = 1; i <= splitNumber; i++){
//拼接完整的绝对路径
name_folder = folder + "/" + file_name + "_"+ i + "." + name_suffix;
FileWriter fileWriter = new FileWriter(name_folder);
System.out.println("开始写入 "+name_folder);
while (len <= count){
String s = lineNumberReader.readLine();
//如果是最后一行 就不换行了
if (len == count){
fileWriter.write(s);
//不是最行一行的时候 需要换行,要不就都写成了一行
}else {
fileWriter.write(s+"\n");
}
// 不是最后一个文件,且 len 等于每个文件应该写入的行数后,就结束 开始写下一文件
if (i != splitNumber & len == i*every_count){
len++;
break;
}else if (len == count){
break;
}
len++;
}
fileWriter.close();
}
System.out.println();
System.out.printf("拆分后的文件保存于 %s \n",folder );
long end_time = System.currentTimeMillis();
System.out.printf("\n拆分结束,耗时:%d 毫秒。",(end_time-start_time));
}
}
8、windows bat文件
java FIleSplit
timeout /nobreak /t 10