这个好像是我一年前去面试时的一道面试题,分享一下!考 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.         }