Java將文件按照指定格式切分成多個文件
按照自定義規(guī)則,拆分文件
1.測試文件路徑:D://test.txt
2.截取規(guī)則content.substring(0,1);
3.第一個符合規(guī)則的字符串String lastA = "1";
4.輸出路徑D://" + lastA + ".txt
實現(xiàn)代碼
public static void main(String[] args) { try { File file = new File("D://test.txt"); InputStreamReader r = new InputStreamReader(new FileInputStream(file)); BufferedReader reader = new BufferedReader(r); String content; String lastA = "1"; StringBuffer sb = new StringBuffer(""); do{ content = reader.readLine(); if(content == null){ //最后一次輸出 File outFile = new File("D://" + lastA + ".txt"); OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(outFile)); writer.write(sb.toString()); writer.close(); break; } //注:你的截取規(guī)則 String a = content.substring(0,1); if(a.equals(lastA)){ sb.append(content).append("\n"); }else{ //標(biāo)識改變,輸出文件 File outFile = new File("D://" + lastA + ".txt"); OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(outFile)); writer.write(sb.toString()); //清空輸出內(nèi)容 sb = new StringBuffer(""); sb.append(content).append("\n"); writer.close(); } lastA = a; System.out.println("======="); }while (true); r.close(); reader.close(); } catch (Exception e) { e.printStackTrace(); } }
測試文件內(nèi)容:
1 123456
1 1234567
2 123abc
2 abcd
3 abcd
上述文件會被切割成三個文件,分別是D://1.txt
、D://2.txt
、D://3.txt
文件內(nèi)容同測試文件對應(yīng)某行,前兩行對應(yīng)文件1.txt,3、4行對應(yīng)文件2.txt,5行對應(yīng)文件3.txt,以此類推
知識擴展
下面小編為大家整理了一些Java對文件進(jìn)行切分的相關(guān)方法,希望對大家有所幫助
java將大文件切割成N個固定大小的文件
方法一:
//java實現(xiàn)把一個大文件切割成N個固定大小的文件 package com.johnny.test; 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 FenGeFile { public static final String SUFFIX = “.txt”; // 分割后的文件名后綴 // 將指定的文件按著給定的文件的字節(jié)數(shù)進(jìn)行分割文件,其中name指的是需要進(jìn)行分割的文件名,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(“文件大?。骸?fileLength+” 字節(jié)”); if (size <= 0) { size = fileLength / 2; } // 取得被分割后的小文件的數(shù)目 int num = (fileLength % size != 0) ? (int) (fileLength / size + 1) : (int) (fileLength / size); // 存放被分割后的小文件名 String[] fileNames = new String[num]; // 輸入文件流,即被分割的文件 FileInputStream in = new FileInputStream(file); // 讀輸入文件流的開始和結(jié)束下標(biāo) long end = 0; int begin = 0; // 根據(jù)要分割的數(shù)目輸出文件 for (int i = 0; i < num; i++) { // 對于前num – 1個小文件,大小都為指定的size File outFile = new File(parentFile, file.getName() + i + SUFFIX); // 構(gòu)建小文件的輸出流 FileOutputStream out = new FileOutputStream(outFile); // 將結(jié)束下標(biāo)后移size end += size; end = (end > fileLength) ? fileLength : end; // 從輸入流中讀取字節(jié)存儲到輸出流中 for (; begin < end; begin++) { out.write(in.read()); } out.close(); fileNames[i] = outFile.getAbsolutePath(); } in.close(); return fileNames; } public static void readFileMessage(String fileName) {// 將分割成的小文件中的內(nèi)容讀出 File file = new File(fileName); BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(file)); String string = null; // 按行讀取內(nèi)容,直到讀入null則表示讀取文件結(jié)束 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 = “D:/boss/123.txt”; long size = 1024*1024*4;//1K=1024b(字節(jié)) String[] fileNames = FenGeFile.divide(name, size); System.out.println(“文件” + name + “分割的結(jié)果如下:”); for (int i = 0; i < fileNames.length; i++) { System.out.println(fileNames[i] + “的內(nèi)容如下:”); //FenGeFile.readFileMessage(fileNames[i]); System.out.println(); } } }
方法二:
public class FileTest { /** * 文件分隔器:給定文件的路徑和每一塊要拆分的大小,就可以按要求拆分文件 * 如果指定的塊給原文件都還要大,為了不動原文件,就生成另一個文件,以.bak為后綴,這樣可以保證原文件 * 如果是程序自動拆分為多個文件,那么后綴分別為".part序號",這樣就可以方便文件的合并了 * 原理:很簡單,就是利用是輸入輸出流,加上隨機文件讀取。 */ String FileName=null;//原文件名 long FileSize=0;//原文件的大小 long BlockNum=0;//可分的塊數(shù) /** * @param fileAndPath 原文件名及路徑 */ private void getFileAttribute(String fileAndPath)//取得原文件的屬性 { File file=new File(fileAndPath); FileName=file.getName(); FileSize=file.length(); } /** * * @param blockSize 每一塊的大小 * @return 能夠分得的塊數(shù) */ private long getBlockNum(long blockSize)//取得分塊數(shù) { long fileSize=FileSize; if(fileSize<=blockSize)//如果分塊的小小只夠分一個塊 return 1; else { if(fileSize%blockSize>0) { return fileSize/blockSize+1; } else return fileSize/blockSize; } } /** * * @param fileAndPath 原文件及完整路徑 * @param currentBlock 當(dāng)前塊的序號 * @return 現(xiàn)在拆分后塊的文件名 */ private String generateSeparatorFileName(String fileAndPath,int currentBlock)//生成折分后的文件名,以便于將來合將 { return fileAndPath+".part"+currentBlock; } /** * * @param fileAndPath 原文件及完整路徑 * @param fileSeparateName 文件分隔后要生成的文件名,與原文件在同一個目錄下 * @param blockSize 當(dāng)前塊要寫的字節(jié)數(shù) * @param beginPos 從原文件的什么地方開始讀取 * @return true為寫入成功,false為寫入失敗 */ private boolean writeFile(String fileAndPath,String fileSeparateName,long blockSize,long beginPos)//往硬盤寫文件 { RandomAccessFile raf=null; FileOutputStream fos=null; byte[] bt=new byte[1024]; long writeByte=0; int len=0; try { raf = new RandomAccessFile(fileAndPath,"r"); raf.seek(beginPos); fos = new FileOutputStream(fileSeparateName); while((len=raf.read(bt))>0) { if(writeByte<blockSize)//如果當(dāng)前塊還沒有寫滿 { writeByte=writeByte+len; if(writeByte<=blockSize) fos.write(bt,0,len); else { len=len-(int)(writeByte-blockSize); fos.write(bt,0,len); } } } fos.close(); raf.close(); } catch (Exception e) { e.printStackTrace(); try { if(fos!=null) fos.close(); if(raf!=null) raf.close(); } catch(Exception f) { f.printStackTrace(); } return false; } return true; } /** * @param fileAndPath 原文路徑及文件名 * @param blockSize 要拆分的每一塊的大小 * @return true為拆分成功,false為拆分失敗 */ private boolean separatorFile(String fileAndPath,long blockSize)//折分文件主函數(shù) { getFileAttribute(fileAndPath);//將文件的名及大小屬性取出來 //System.out.println("FileSize:"+FileSize); //System.out.println("blockSize:"+blockSize); BlockNum=getBlockNum(blockSize);//取得分塊總數(shù) //System.out.println("BlockNum:"+BlockNum); //System.exit(0); if(BlockNum==1)//如果只能夠分一塊,就一次性寫入 blockSize=FileSize; long writeSize=0;//每次寫入的字節(jié) long writeTotal=0;//已經(jīng)寫了的字節(jié) String FileCurrentNameAndPath=null; for(int i=1;i<=BlockNum;i++) { if(i<BlockNum) writeSize=blockSize;//取得每一次要寫入的文件大小 else writeSize=FileSize-writeTotal; if(BlockNum==1) FileCurrentNameAndPath=fileAndPath+".bak"; else FileCurrentNameAndPath=generateSeparatorFileName(fileAndPath,i); //System.out.print("本次寫入:"+writeSize); if(!writeFile(fileAndPath,FileCurrentNameAndPath,writeSize,writeTotal))//循環(huán)往硬盤寫文件 return false; writeTotal=writeTotal+writeSize; //System.out.println(" 總共寫入:"+writeTotal); } return true; } public static void main(String[] args) { FileTest separator = new FileTest(); String fileAndPath="f://abc.txt";//文件名及路徑 long blockSize=200*1024;//每一個文件塊的大小,大小是按字節(jié)計算 if(separator.separatorFile(fileAndPath,blockSize)) { System.out.println("文件折分成功!"); } else { System.out.println("文件折分失??!"); } } }
到此這篇關(guān)于Java將文件按照指定格式切分成多個文件的文章就介紹到這了,更多相關(guān)Java文件切分內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
quartz定時執(zhí)行任務(wù),并配置web.xml的操作方法
下面小編就為大家?guī)硪黄猶uartz定時執(zhí)行任務(wù),并配置web.xml的操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07jquery uploadify和apache Fileupload實現(xiàn)異步上傳文件示例
這篇文章主要介紹了jquery uploadify和apache Fileupload實現(xiàn)異步上傳文件示例,需要的朋友可以參考下2014-05-05mybatis Map查詢結(jié)果下劃線轉(zhuǎn)駝峰的實例
這篇文章主要介紹了mybatis Map查詢結(jié)果下劃線轉(zhuǎn)駝峰的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09