Java实现按行分割大文件
简介
工作的时候,需要将一个大的文本文件按行分割成几个小文件。本来懒得写,想网上copy一下得了,但是google了一遍,找了几个代码写的有点乱,尝试了之后发现效率太慢了,一个1000000行 200M的文件,按每个文件2000行分割,要6分多钟才能跑完。没办法自己写了个,试了几次,基本都是4秒内跑完,贴出来记录下,下次用就直接copy出来用。
代码
publicstaticListsplitDataToSaveFile(introws,FilesourceFile,StringtargetDirectoryPath){ longstartTime=System.currentTimeMillis(); List fileList=newArrayList<>(); log.info("开始分割文件"); FiletargetFile=newFile(targetDirectoryPath); if(!sourceFile.exists()||rows<=0||sourceFile.isDirectory()){ returnnull; } if(targetFile.exists()){ if(!targetFile.isDirectory()){ returnnull; } }else{ targetFile.mkdirs(); } try(FileInputStreamfileInputStream=newFileInputStream(sourceFile); InputStreamReaderinputStreamReader=newInputStreamReader(fileInputStream,StandardCharsets.UTF_8); BufferedReaderbufferedReader=newBufferedReader(inputStreamReader)){ StringBuilderstringBuilder=newStringBuilder(); StringlineStr; intlineNo=1,fileNum=1; while((lineStr=bufferedReader.readLine())!=null){ stringBuilder.append(lineStr).append("\r\n"); if(lineNo%rows==0){ Filefile=newFile(targetDirectoryPath+File.separator+fileNum+sourceFile.getName()); writeFile(stringBuilder.toString(),file); //清空文本 stringBuilder.delete(0,stringBuilder.length()); fileNum++; fileList.add(file); } lineNo++; } if((lineNo-1)%rows!=0){ Filefile=newFile(targetDirectoryPath+File.separator+fileNum+sourceFile.getName()); writeFile(stringBuilder.toString(),file); fileList.add(file); } longendTime=System.currentTimeMillis(); log.info("分割文件结束,耗时:{}秒",(endTime-startTime)/1000); }catch(Exceptione){ log.error("分割文件异常",e); } returnfileList; } privatestaticvoidwriteFile(Stringtext,Filefile){ try( FileOutputStreamfileOutputStream=newFileOutputStream(file); OutputStreamWriteroutputStreamWriter=newOutputStreamWriter(fileOutputStream,StandardCharsets.UTF_8); BufferedWriterbufferedWriter=newBufferedWriter(outputStreamWriter,1024) ){ bufferedWriter.write(text); }catch(IOExceptione){ e.printStackTrace(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。