import java.io.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; @Slf4j public class SegFile { /** * 根据需求,直接调用静态方法start来执行操作 参数: rows 为多少行一个文件 int 类型 sourceFilePath 为源文件路径 * String 类型 targetDirectoryPath 为文件分割后存放的目标目录 String 类型 * ---分割后的文件名为源文件+'_'+索引号(从0开始)+扩展名名,例如源文件名为test.txt,则分割后文件名为test_0.txt,以此类推 */ public static void start(long rows, File sourceFile, File targetFile) { if (!sourceFile.exists() || rows <= 0 || sourceFile.isDirectory()) { log.info("源文件不存在或者输入了错误的行数"); return; } if (targetFile.exists()) { if (!targetFile.isDirectory()) { log.info("目标文件夹错误,不是一个文件夹"); return; } } else { targetFile.mkdirs(); } long startTime = System.currentTimeMillis(); FileInputStream in = null; InputStreamReader inputStreamReader=null; BufferedWriter bw = null; BufferedReader br= null; FileOutputStream fileOutputStream=null; OutputStreamWriter outputStreamWriter = null; try { in = new FileInputStream(sourceFile); inputStreamReader = new InputStreamReader(in, "GBK") ; br = new BufferedReader(inputStreamReader); String fullFileNm = sourceFile.getName(); int extIndex = fullFileNm.lastIndexOf("."); String noExtFileNm = fullFileNm; String extFileNm = ""; if (extIndex > 0) { noExtFileNm = fullFileNm.substring(0, extIndex); extFileNm = fullFileNm.substring(extIndex); } String tmpStr = ""; String lineStr = ""; int i = 1, fileCount = 0; while ((lineStr = br.readLine()) != null) { tmpStr += lineStr + "\r\n"; if (i % rows == 0) { File file = new File(targetFile.getAbsolutePath() + "/" + noExtFileNm + "_" + fileCount + extFileNm); fileOutputStream =new FileOutputStream(file); outputStreamWriter = new OutputStreamWriter(fileOutputStream, "GBK"); bw = new BufferedWriter(outputStreamWriter); bw.write(tmpStr); tmpStr = ""; fileCount += 1; IOUtils.closeQuietly(bw); log.info("{}文件分割中,分割文件为:{}",fullFileNm,file.getName()); } i++; } if ((i - 1) % rows != 0) { File file = new File(targetFile.getAbsolutePath() + "/" + noExtFileNm + "_" + fileCount + extFileNm); fileOutputStream =new FileOutputStream(file); outputStreamWriter = new OutputStreamWriter(fileOutputStream, "GBK"); bw = new BufferedWriter(outputStreamWriter); bw.write(tmpStr); IOUtils.closeQuietly(bw); IOUtils.closeQuietly(br); fileCount += 1; log.info("{}文件分割中,分割文件为:{}",fullFileNm,file.getName()); } log.info("文件分割结束,共分割成了" + fileCount + "个文件"); } catch (Exception e) { log.error("文件切割异常:{}",e); }finally { IOUtils.closeQuietly(in); IOUtils.closeQuietly(inputStreamReader); IOUtils.closeQuietly(fileOutputStream); IOUtils.closeQuietly(outputStreamWriter); } long endTime = System.currentTimeMillis(); log.info("初次导入存量数据总耗时" + (endTime - startTime) / 1000 + "秒"); } }
切割大文件TXT
最新推荐文章于 2024-04-25 23:56:43 发布