1. 程式人生 > 程式設計 >Java實現按行分割大檔案

Java實現按行分割大檔案

簡介

工作的時候,需要將一個大的文字檔案按行分割成幾個小檔案。本來懶得寫,想網上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();
  }
 }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。