Java将文件按照指定格式切分成多个文件
作者:ywh22122
这篇文章主要为大家详细介绍了Java如何将文件按照指定格式切分成多个文件,文中的示例代码简洁易懂,有需要的小伙伴可以参考一下
按照自定义规则,拆分文件
1.测试文件路径:D://test.txt
2.截取规则content.substring(0,1);
3.第一个符合规则的字符串String lastA = "1";
4.输出路径D://" + lastA + ".txt
实现代码
public static void main(String[] args) {
try {
File file = new File("D://test.txt");
InputStreamReader r = new InputStreamReader(new FileInputStream(file));
BufferedReader reader = new BufferedReader(r);
String content;
String lastA = "1";
StringBuffer sb = new StringBuffer("");
do{
content = reader.readLine();
if(content == null){
//最后一次输出
File outFile = new File("D://" + lastA + ".txt");
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(outFile));
writer.write(sb.toString());
writer.close();
break;
}
//注:你的截取规则
String a = content.substring(0,1);
if(a.equals(lastA)){
sb.append(content).append("\n");
}else{
//标识改变,输出文件
File outFile = new File("D://" + lastA + ".txt");
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(outFile));
writer.write(sb.toString());
//清空输出内容
sb = new StringBuffer("");
sb.append(content).append("\n");
writer.close();
}
lastA = a;
System.out.println("=======");
}while (true);
r.close();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
测试文件内容:
1 123456
1 1234567
2 123abc
2 abcd
3 abcd
上述文件会被切割成三个文件,分别是D://1.txt、D://2.txt、D://3.txt
文件内容同测试文件对应某行,前两行对应文件1.txt,3、4行对应文件2.txt,5行对应文件3.txt,以此类推
知识扩展
下面小编为大家整理了一些Java对文件进行切分的相关方法,希望对大家有所帮助
java将大文件切割成N个固定大小的文件
方法一:
//java实现把一个大文件切割成N个固定大小的文件
package com.johnny.test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
public class FenGeFile {
public static final String SUFFIX = “.txt”; // 分割后的文件名后缀
// 将指定的文件按着给定的文件的字节数进行分割文件,其中name指的是需要进行分割的文件名,size指的是指定的小文件的大小
public static String[] divide(String name, long size) throws Exception {
File file = new File(name);
if (!file.exists() || (!file.isFile())) {
throw new Exception(“指定文件不存在!”);
}
// 获得被分割文件父文件,将来被分割成的小文件便存在这个目录下
File parentFile = file.getParentFile();
// 取得文件的大小
long fileLength = file.length();
System.out.println(“文件大小:”+fileLength+” 字节”);
if (size <= 0) {
size = fileLength / 2;
}
// 取得被分割后的小文件的数目
int num = (fileLength % size != 0) ? (int) (fileLength / size + 1)
: (int) (fileLength / size);
// 存放被分割后的小文件名
String[] fileNames = new String[num];
// 输入文件流,即被分割的文件
FileInputStream in = new FileInputStream(file);
// 读输入文件流的开始和结束下标
long end = 0;
int begin = 0;
// 根据要分割的数目输出文件
for (int i = 0; i < num; i++) {
// 对于前num – 1个小文件,大小都为指定的size
File outFile = new File(parentFile, file.getName() + i + SUFFIX);
// 构建小文件的输出流
FileOutputStream out = new FileOutputStream(outFile);
// 将结束下标后移size
end += size;
end = (end > fileLength) ? fileLength : end;
// 从输入流中读取字节存储到输出流中
for (; begin < end; begin++) {
out.write(in.read());
}
out.close();
fileNames[i] = outFile.getAbsolutePath();
}
in.close();
return fileNames;
}
public static void readFileMessage(String fileName) {// 将分割成的小文件中的内容读出
File file = new File(fileName);
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
String string = null;
// 按行读取内容,直到读入null则表示读取文件结束
while ((string = reader.readLine()) != null) {
System.out.println(string);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
}
}
public static void main(final String[] args) throws Exception {
String name = “D:/boss/123.txt”;
long size = 1024*1024*4;//1K=1024b(字节)
String[] fileNames = FenGeFile.divide(name, size);
System.out.println(“文件” + name + “分割的结果如下:”);
for (int i = 0; i < fileNames.length; i++) {
System.out.println(fileNames[i] + “的内容如下:”);
//FenGeFile.readFileMessage(fileNames[i]);
System.out.println();
}
}
} 方法二:
public class FileTest {
/**
* 文件分隔器:给定文件的路径和每一块要拆分的大小,就可以按要求拆分文件
* 如果指定的块给原文件都还要大,为了不动原文件,就生成另一个文件,以.bak为后缀,这样可以保证原文件
* 如果是程序自动拆分为多个文件,那么后缀分别为".part序号",这样就可以方便文件的合并了
* 原理:很简单,就是利用是输入输出流,加上随机文件读取。
*/
String FileName=null;//原文件名
long FileSize=0;//原文件的大小
long BlockNum=0;//可分的块数
/**
* @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)
{
FileTest separator = new FileTest();
String fileAndPath="f://abc.txt";//文件名及路径
long blockSize=200*1024;//每一个文件块的大小,大小是按字节计算
if(separator.separatorFile(fileAndPath,blockSize)) {
System.out.println("文件折分成功!");
}
else {
System.out.println("文件折分失败!");
}
}
}到此这篇关于Java将文件按照指定格式切分成多个文件的文章就介绍到这了,更多相关Java文件切分内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
