Java實現按行分割大檔案
阿新 • • 發佈:2020-05-21
簡介
工作的時候,需要將一個大的文字檔案按行分割成幾個小檔案。本來懶得寫,想網上copy一下得了,但是 google 了一遍,找了幾個程式碼寫的有點亂,嘗試了之後發現效率太慢了,一個 1000000 行200M 的檔案,按每個檔案 2000 行分割,要6分多鐘才能跑完。沒辦法自己寫了個,試了幾次,基本都是 4 秒內跑完,貼出來記錄下,下次用就直接 copy 出來用。
程式碼
public static List<File> splitDataToSaveFile(int rows,File sourceFile,String targetDirectoryPath) { long startTime = System.currentTimeMillis(); List<File> fileList = new ArrayList<>(); log.info("開始分割檔案"); 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("分割檔案結束,耗時:{}秒",(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(); } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。