最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java將文件按照指定格式切分成多個(gè)文件

 更新時(shí)間:2025年03月08日 15:38:05   作者:ywh22122  
這篇文章主要為大家詳細(xì)介紹了Java如何將文件按照指定格式切分成多個(gè)文件,文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以參考一下

按照自定義規(guī)則,拆分文件

1.測(cè)試文件路徑:D://test.txt

2.截取規(guī)則content.substring(0,1);

3.第一個(gè)符合規(guī)則的字符串String lastA = "1";

4.輸出路徑D://" + lastA + ".txt

實(shí)現(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)識(shí)改變,輸出文件
                    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();
        }


    }

測(cè)試文件內(nèi)容:

1 123456
1 1234567
2 123abc
2 abcd
3 abcd

上述文件會(huì)被切割成三個(gè)文件,分別是D://1.txt、D://2.txt、D://3.txt

文件內(nèi)容同測(cè)試文件對(duì)應(yīng)某行,前兩行對(duì)應(yīng)文件1.txt,3、4行對(duì)應(yīng)文件2.txt,5行對(duì)應(yīng)文件3.txt,以此類(lèi)推

知識(shí)擴(kuò)展

下面小編為大家整理了一些Java對(duì)文件進(jìn)行切分的相關(guān)方法,希望對(duì)大家有所幫助

java將大文件切割成N個(gè)固定大小的文件

方法一:

//java實(shí)現(xiàn)把一個(gè)大文件切割成N個(gè)固定大小的文件 
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(“指定文件不存在!”); 
                } 
                // 獲得被分割文件父文件,將來(lái)被分割成的小文件便存在這個(gè)目錄下 
                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); 
                // 讀輸入文件流的開(kāi)始和結(jié)束下標(biāo) 
                long end = 0; 
                int begin = 0; 
                // 根據(jù)要分割的數(shù)目輸出文件 
                for (int i = 0; i < num; i++) { 
                        // 對(duì)于前num – 1個(gè)小文件,大小都為指定的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é)存儲(chǔ)到輸出流中 
                        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 {
 
    /**
      * 文件分隔器:給定文件的路徑和每一塊要拆分的大小,就可以按要求拆分文件
      * 如果指定的塊給原文件都還要大,為了不動(dòng)原文件,就生成另一個(gè)文件,以.bak為后綴,這樣可以保證原文件
      * 如果是程序自動(dòng)拆分為多個(gè)文件,那么后綴分別為".part序號(hào)",這樣就可以方便文件的合并了
      * 原理:很簡(jiǎn)單,就是利用是輸入輸出流,加上隨機(jī)文件讀取。
      */
    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)//如果分塊的小小只夠分一個(gè)塊
        return 1;
        else {
            if(fileSize%blockSize>0) {
                return fileSize/blockSize+1;
            } else
                return fileSize/blockSize;
        }
    }
    /**
    *
    * @param fileAndPath 原文件及完整路徑
    * @param currentBlock 當(dāng)前塊的序號(hào)
    * @return 現(xiàn)在拆分后塊的文件名
    */
    private String generateSeparatorFileName(String fileAndPath,int currentBlock)//生成折分后的文件名,以便于將來(lái)合將
    {
        return fileAndPath+".part"+currentBlock;
    }
    /**
    *
    * @param fileAndPath 原文件及完整路徑
    * @param fileSeparateName 文件分隔后要生成的文件名,與原文件在同一個(gè)目錄下
    * @param blockSize 當(dāng)前塊要寫(xiě)的字節(jié)數(shù)
    * @param beginPos 從原文件的什么地方開(kāi)始讀取
    * @return true為寫(xiě)入成功,false為寫(xiě)入失敗
    */
    private boolean writeFile(String fileAndPath,String fileSeparateName,long blockSize,long beginPos)//往硬盤(pán)寫(xiě)文件
    {
        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)前塊還沒(méi)有寫(xiě)滿(mǎn)
                {
                    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);//將文件的名及大小屬性取出來(lái)
        //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)//如果只能夠分一塊,就一次性寫(xiě)入
            blockSize=FileSize;
        long writeSize=0;//每次寫(xiě)入的字節(jié)
        long writeTotal=0;//已經(jīng)寫(xiě)了的字節(jié)
        String FileCurrentNameAndPath=null;
        for(int i=1;i<=BlockNum;i++)
        {
            if(i<BlockNum)
                writeSize=blockSize;//取得每一次要寫(xiě)入的文件大小
            else
                writeSize=FileSize-writeTotal;
            if(BlockNum==1)
                FileCurrentNameAndPath=fileAndPath+".bak";
            else
                FileCurrentNameAndPath=generateSeparatorFileName(fileAndPath,i);
            //System.out.print("本次寫(xiě)入:"+writeSize);     
            if(!writeFile(fileAndPath,FileCurrentNameAndPath,writeSize,writeTotal))//循環(huán)往硬盤(pán)寫(xiě)文件
                return false;
            writeTotal=writeTotal+writeSize;
            //System.out.println("  總共寫(xiě)入:"+writeTotal);
        }
        return true;
    }
 
    public static void main(String[] args)
    {
        FileTest separator = new FileTest();
        String fileAndPath="f://abc.txt";//文件名及路徑
        long blockSize=200*1024;//每一個(gè)文件塊的大小,大小是按字節(jié)計(jì)算
        if(separator.separatorFile(fileAndPath,blockSize)) {
            System.out.println("文件折分成功!");
        }
        else {
            System.out.println("文件折分失??!");
        }
    }
 
 
}

到此這篇關(guān)于Java將文件按照指定格式切分成多個(gè)文件的文章就介紹到這了,更多相關(guān)Java文件切分內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)字符串排列組合問(wèn)題

    java實(shí)現(xiàn)字符串排列組合問(wèn)題

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)字符串排列組合問(wèn)題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Java內(nèi)存分配多種情況的用法解析

    Java內(nèi)存分配多種情況的用法解析

    這篇文章主要介紹了Java內(nèi)存分配多種情況的用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 淺析Java的Hibernate框架中的緩存和延遲加載機(jī)制

    淺析Java的Hibernate框架中的緩存和延遲加載機(jī)制

    這篇文章主要介紹了Java的Hibernate框架中的緩存和延遲加載機(jī)制,Hibernate是注明的Java下SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下
    2015-11-11
  • SpringBoot+MyBatis實(shí)現(xiàn)數(shù)據(jù)庫(kù)字段級(jí)加密

    SpringBoot+MyBatis實(shí)現(xiàn)數(shù)據(jù)庫(kù)字段級(jí)加密

    在數(shù)據(jù)安全越來(lái)越受重視的今天,如何保護(hù)用戶(hù)的敏感信息成為每個(gè)開(kāi)發(fā)者都要面對(duì)的問(wèn)題,本文將分享一個(gè)基于注解的自動(dòng)加解密方案,感興趣的小伙伴可以了解下
    2025-11-11
  • Java實(shí)現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址

    Java實(shí)現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址

    這篇文章主要介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定的參考價(jià)值,快跟隨小編一起學(xué)習(xí)一下吧
    2022-06-06
  • SpringBoot集成quartz實(shí)現(xiàn)定時(shí)任務(wù)詳解

    SpringBoot集成quartz實(shí)現(xiàn)定時(shí)任務(wù)詳解

    最為常用定時(shí)任務(wù)框架是Quartz,并且Spring也集成了Quartz的框架,Quartz不僅支持單實(shí)例方式還支持分布式方式。本文主要介紹Quartz,基礎(chǔ)的Quartz的集成案例本,以及實(shí)現(xiàn)基于數(shù)據(jù)庫(kù)的分布式任務(wù)管理和控制job生命周期
    2022-08-08
  • SpringBoot接口返回日期格式化的3種方法實(shí)現(xiàn)與對(duì)比

    SpringBoot接口返回日期格式化的3種方法實(shí)現(xiàn)與對(duì)比

    這篇文章主要為大家詳細(xì)介紹了SpringBoot中接口返回日期格式化的3種方法實(shí)現(xiàn)與對(duì)比,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-09-09
  • JAVA實(shí)現(xiàn)PDF轉(zhuǎn)HTML文檔的示例代碼

    JAVA實(shí)現(xiàn)PDF轉(zhuǎn)HTML文檔的示例代碼

    本文是基于PDF文檔轉(zhuǎn)PNG圖片,然后進(jìn)行圖片拼接,拼接后的圖片轉(zhuǎn)為base64字符串,然后拼接html文檔寫(xiě)入html文件實(shí)現(xiàn)PDF文檔轉(zhuǎn)HTML文檔,感興趣的可以了解一下
    2021-05-05
  • SpringBoot項(xiàng)目打包成jar后獲取classpath下文件失敗的解決

    SpringBoot項(xiàng)目打包成jar后獲取classpath下文件失敗的解決

    這篇文章主要介紹了SpringBoot項(xiàng)目打包成jar后獲取classpath下文件失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Redis之GEO存儲(chǔ)地理位置信息的使用

    Redis之GEO存儲(chǔ)地理位置信息的使用

    在外賣(mài)軟件中的附近的美食店鋪、外賣(mài)小哥的距離,打車(chē)軟件附近的車(chē)輛,交友軟件中附近的小姐姐。我們都可以利用redis的GEO地理位置計(jì)算得出。本文就來(lái)詳細(xì)的介紹一下
    2021-10-10

最新評(píng)論

昭苏县| 长乐市| 湘乡市| 吉木萨尔县| 师宗县| 双流县| 贵溪市| 乌拉特中旗| 抚顺市| 治多县| 和平区| 西畴县| 玉龙| 石家庄市| 普定县| 靖远县| 井冈山市| 元谋县| 永清县| 扎鲁特旗| 海安县| 佳木斯市| 合阳县| 桑日县| 深水埗区| 陵川县| 徐水县| 曲周县| 镇雄县| 当雄县| 桂东县| 孙吴县| 石阡县| 寿宁县| 罗定市| 松阳县| 侯马市| 临桂县| 林口县| 会同县| 吕梁市|