話不多說,直接上代碼
import java.io.*; /*** * 分割大文件 * ( * SQL 文件太大(insert),第三方工具無法一次性讀取,進行分割 * 生成 一個一個文件 * ) */ public class SplitFileUtil { // 使用示例 public static void main(String[] args) { // 目標文件 String targetFile = "F:\\logs\\insert11.sql"; // 存放的目錄 String saveDir = "F:\\logs\\Insert"; // 自定義的生成文件前綴名 String saveFileName = "insert"; // 生成文件格式的后綴 String suffix = "sql"; // 自定義 一個文件的行數,這里是 100000 行 一個文件 long splitSize = 100000; try { splitFile(targetFile, saveDir, saveFileName, suffix, splitSize); } catch (Exception e) { e.printStackTrace(); } } /** * @param targetFile 目標文件路徑 * @param saveDir 存放的目錄 * @param saveFileName 生成文件的前綴名 * @param suffix 生成文件的后綴名 * @param splitSize 每一個文件 多少行數據 */ public static void splitFile(String targetFile, String saveDir , String saveFileName, String suffix,long splitSize) throws Exception { if( !saveDir.endsWith("\\") ){ saveDir += File.separator; } File file = new File(targetFile); if (!file.exists()) { throw new Exception("目標路徑:[ " + targetFile + " ] 有錯誤..."); } // 輸入緩沖流 BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); String str = null; // 行數 long len = 0; System.out.println("開始寫入......請等待......"); long startTime = System.currentTimeMillis(); // 輸出緩沖流 BufferedWriter writer = null; while ((str = reader.readLine()) != null) { // 當前 行 文件 long txtSize = (len / splitSize) + 1; String fileName = saveDir + saveFileName + txtSize + "." + suffix; // 使用 BufferedWriter 如果 不進行 flush 或者 close 寫入不了內容。 writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName, true))); writer.write(str + System.lineSeparator() ); writer.flush(); len ++; } writer.close(); reader.close(); System.out.println( "寫入完畢,一共 " + len + " 記錄,耗時:" + ( System.currentTimeMillis() - startTime ) / 1000 + " s" ); } }