package dividefile;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.IOException; public class dividefile { public static final String SUFFIX = ".sql"; // 分割后的文件名后綴 // 將指定的文件按著給定的文件的字節數進行分割文件,其中name指的是需要進行分割的文件名,size指的是指定的小文件的大小 public static String[] divide(String name, long size) throws Exception { File file = new File(name); if (!file.exists() || (!file.isFile())) { throw new Exception("指定文件不存在!"); } // 獲得被分割文件父文件,將來被分割成的小文件便存在這個目錄下 File parentFile = file.getParentFile(); // 取得文件的大小 long fileLength = file.length(); System.out.PRintln("文件大?。?quot; + fileLength + " 字節"); if (size <= 0) { size = fileLength / 2; } // 取得被分割后的小文件的數目 int num = (fileLength % size != 0) ? (int) (fileLength / size + 1) : (int) (fileLength / size); // 存放被分割后的小文件名 String[] fileNames = new String[num]; // 輸入文件流,即被分割的文件 FileInputStream in = new FileInputStream(file); // 讀輸入文件流的開始和結束下標 long end = 0; int begin = 0; // 根據要分割的數目輸出文件 for (int i = 0; i < num; i++) { // 對于前num - 1個小文件,大小都為指定的size File outFile = new File(parentFile, file.getName() + i + SUFFIX); // 構建小文件的輸出流 FileOutputStream out = new FileOutputStream(outFile); // 將結束下標后移size end += size; end = (end > fileLength) ? fileLength : end; // 從輸入流中讀取字節存儲到輸出流中 for (; begin < end; begin++) { out.write(in.read()); } out.close(); fileNames[i] = outFile.getAbsolutePath(); } in.close(); return fileNames; } public static void readFileMessage(String fileName) {// 將分割成的小文件中的內容讀出 File file = new File(fileName); BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(file)); String string = null; // 按行讀取內容,直到讀入null則表示讀取文件結束 while ((string = reader.readLine()) != null) { System.out.println(string); } reader.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e1) { } } } } public static void main(final String[] args) throws Exception { String name = "G:/ad.tar/ad/ad_samples.dat"; long size = 1024 * 1024 * 4;// 1K=1024b(字節) String[] fileNames = dividefile.divide(name, size); System.out.println("文件" + name + "分割的結果如下:"); for (int i = 0; i < fileNames.length; i++) { System.out.println(fileNames[i] + "的內容如下:"); // FenGeFile.readFileMessage(fileNames[i]); System.out.println(); } }}
新聞熱點
疑難解答
圖片精選