Java實(shí)現(xiàn)按行分割大文件
簡(jiǎn)介
工作的時(shí)候,需要將一個(gè)大的文本文件按行分割成幾個(gè)小文件。本來(lái)懶得寫,想網(wǎng)上copy一下得了,但是 google 了一遍,找了幾個(gè)代碼寫的有點(diǎn)亂,嘗試了之后發(fā)現(xiàn)效率太慢了,一個(gè) 1000000 行 200M 的文件,按每個(gè)文件 2000 行分割,要6分多鐘才能跑完。沒(méi)辦法自己寫了個(gè),試了幾次,基本都是 4 秒內(nèi)跑完,貼出來(lái)記錄下,下次用就直接 copy 出來(lái)用。
代碼
public static List<File> splitDataToSaveFile(int rows, File sourceFile, String targetDirectoryPath) {
long startTime = System.currentTimeMillis();
List<File> fileList = new ArrayList<>();
log.info("開(kāi)始分割文件");
File targetFile = new File(targetDirectoryPath);
if (!sourceFile.exists() || rows <= 0 || sourceFile.isDirectory()) {
return null;
}
if (targetFile.exists()) {
if (!targetFile.isDirectory()) {
return null;
}
} else {
targetFile.mkdirs();
}
try (FileInputStream fileInputStream = new FileInputStream(sourceFile);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
StringBuilder stringBuilder = new StringBuilder();
String lineStr;
int lineNo = 1, fileNum = 1;
while ((lineStr = bufferedReader.readLine()) != null) {
stringBuilder.append(lineStr).append("\r\n");
if (lineNo % rows == 0) {
File file = new File(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) {
File file = new File(targetDirectoryPath + File.separator + fileNum + sourceFile.getName());
writeFile(stringBuilder.toString(), file);
fileList.add(file);
}
long endTime = System.currentTimeMillis();
log.info("分割文件結(jié)束,耗時(shí):{}秒", (endTime - startTime) / 1000);
} catch (Exception e) {
log.error("分割文件異常", e);
}
return fileList;
}
private static void writeFile(String text, File file) {
try (
FileOutputStream fileOutputStream = new FileOutputStream(file);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8);
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter, 1024)
) {
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud中的OpenFeign調(diào)用解讀
OpenFeign是一個(gè)顯示聲明式的WebService客戶端,使用OpenFeign能讓編寫Web Service客戶端更加簡(jiǎn)單OpenFeign的設(shè)計(jì)宗旨式簡(jiǎn)化Java Http客戶端的開(kāi)發(fā),本文給大家介紹SpringCloud之OpenFeign調(diào)用解讀,感興趣的朋友一起看看吧2023-11-11
一文詳解java如何實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用
從?Java?8?開(kāi)始,便引入了一種稱為“流式?API”的編程風(fēng)格,當(dāng)然也被稱為“鏈?zhǔn)皆O(shè)置”或“鏈?zhǔn)秸{(diào)用”,本文主要來(lái)和大家討論一下如何實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用,感興趣的可以了解下2023-12-12
Java SpringBoot安全框架整合Spring Security詳解
這篇文章主要介紹了Spring Boot整合Spring Security的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-09-09
詳解高性能緩存Caffeine原理及實(shí)戰(zhàn)
Caffeine是基于Java 8開(kāi)發(fā)的,提供了近乎最佳命中率的高性能本地緩存組件,Spring5開(kāi)始不再支持Guava Cache,改為使用Caffeine。Caffeine提供的內(nèi)存緩存使用參考Google guava的API2021-06-06
IDEA中程序包Org.Springframework.Boot不存在問(wèn)題及解決
這篇文章主要介紹了IDEA中程序包Org.Springframework.Boot不存在問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Java實(shí)現(xiàn)斗地主與猜數(shù)字游戲詳細(xì)流程
這篇文章主要介紹了怎么用Java來(lái)寫斗地主種洗牌和發(fā)牌的功能,以及猜數(shù)字的游戲,斗地主相信大家都知道,同時(shí)也知道每一局都要洗牌打亂順序再發(fā)牌,本篇我們就來(lái)實(shí)現(xiàn)它們能,感興趣的朋友跟隨文章往下看看吧2022-04-04

