java實現把一個大文件切割成N個固定大小的文件

這個好像是我一年前去面試時的一道面試題,分享一下!考 java I/O 的!

  1. //java實現把一個大文件切割成N個固定大小的文件 
  2. package com.johnny.test; 
  3. import java.io.BufferedReader; 
  4. import java.io.File; 
  5. import java.io.FileInputStream; 
  6. import java.io.FileOutputStream; 
  7. import java.io.FileReader; 
  8. import java.io.IOException; 
  9. public class FenGeFile { 
  10.         public static final String SUFFIX = “.txt”; // 分割後的文件名後綴 
  11.         // 將指定的文件按着給定的文件的字節數進行分割文件,其中name指的是需要進行分割的文件名,size指的是指定的小文件的大小 
  12.         public static String[] divide(String name, long size) throws Exception { 
  13.                 File file = new File(name); 
  14.                 if (!file.exists() || (!file.isFile())) { 
  15.                         throw new Exception(“指定文件不存在!”); 
  16.                 } 
  17.                 // 獲得被分割文件父文件,將來被分割成的小文件便存在這個目錄下 
  18.                 File parentFile = file.getParentFile(); 
  19.                 // 取得文件的大小 
  20.                 long fileLength = file.length(); 
  21.                 System.out.println(“文件大小:”+fileLength+” 字節”); 
  22.                 if (size <= 0) { 
  23.                         size = fileLength / 2
  24.                 } 
  25.                 // 取得被分割後的小文件的數目 
  26.                 int num = (fileLength % size != 0) ? (int) (fileLength / size + 1
  27.                                 : (int) (fileLength / size); 
  28.                 // 存放被分割後的小文件名 
  29.                 String[] fileNames = new String[num]; 
  30.                 // 輸入文件流,即被分割的文件 
  31.                 FileInputStream in = new FileInputStream(file); 
  32.                 // 讀輸入文件流的開始和結束下標 
  33.                 long end = 0
  34.                 int begin = 0
  35.                 // 根據要分割的數目輸出文件 
  36.                 for (int i = 0; i < num; i++) { 
  37.                         // 對於前num – 1個小文件,大小都爲指定的size 
  38.                         File outFile = new File(parentFile, file.getName() + i + SUFFIX); 
  39.                         // 構建小文件的輸出流 
  40.                         FileOutputStream out = new FileOutputStream(outFile); 
  41.                         // 將結束下標後移size 
  42.                         end += size; 
  43.                         end = (end > fileLength) ? fileLength : end; 
  44.                         // 從輸入流中讀取字節存儲到輸出流中 
  45.                         for (; begin < end; begin++) { 
  46.                                 out.write(in.read()); 
  47.                         } 
  48.                         out.close(); 
  49.                         fileNames[i] = outFile.getAbsolutePath(); 
  50.                 } 
  51.                 in.close(); 
  52.                 return fileNames; 
  53.         } 
  54.         public static void readFileMessage(String fileName) {// 將分割成的小文件中的內容讀出 
  55.                 File file = new File(fileName); 
  56.                 BufferedReader reader = null
  57.                 try { 
  58.                         reader = new BufferedReader(new FileReader(file)); 
  59.                         String string = null
  60.                         // 按行讀取內容,直到讀入null則表示讀取文件結束 
  61.                         while ((string = reader.readLine()) != null) { 
  62.                                 System.out.println(string); 
  63.                         } 
  64.                         reader.close(); 
  65.                 } catch (IOException e) { 
  66.                         e.printStackTrace(); 
  67.                 } finally { 
  68.                         if (reader != null) { 
  69.                                 try { 
  70.                                         reader.close(); 
  71.                                 } catch (IOException e1) { 
  72.                                 } 
  73.                         } 
  74.                 } 
  75.         } 
  76.         public static void main(final String[] args) throws Exception { 
  77.                 String name = “D:/boss/123.txt”; 
  78.                 long size = 1024*1024*4;//1K=1024b(字節) 
  79.                 String[] fileNames = FenGeFile.divide(name, size); 
  80.                 System.out.println(“文件” + name + “分割的結果如下:”); 
  81.                 for (int i = 0; i < fileNames.length; i++) { 
  82.                         System.out.println(fileNames[i] + “的內容如下:”); 
  83.                         //FenGeFile.readFileMessage(fileNames[i]); 
  84.                         System.out.println(); 
  85.                 } 
  86.         } 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章