6.6(java學習筆記)文件分割(IO綜合例子)

基本思路:

文件分割:將一個文件分割成若干個獨立的文件。

    ? ?設置分割后小文件文件的字節數,然后讀取被分割文件,

     將對應的字節數寫入分割后的小文件中。

    ? ? 使用seek定位下一次讀取位置。

     

文件合并:將分割后的若干的文件合并成一個完整的文件。

     按照原有分割順序逐個讀取分割后的小文件,

     然后以追加的方式寫入合并的文件中。

?

讀取被分割文件將指定字節數寫入分割后小文件時,下一次讀取時要確保當前讀取位置是上一次的寫入的終點。

例如文件有5000K,設置分割后的文件大小1000K,那么第一次從0開始讀取1000K寫入小文件1,第二次就要從1000開始讀取1000K寫入小文件2.

這時就需要用到seek()不斷設置文件讀取位置。

?

seek是RandomAccessFile類中的函數

構造方法,mode為設置讀寫方法,“”r“為只讀”w”為只寫。

?

?

設置文件指針偏移量,下一次讀或寫時,從當前設置的位置開始。

read,write方法與輸入輸出流函數相同。

?

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;public class FileSplit {private String filePath;//文件路徑private long blockSize;//每一塊大小private int blockNum;//塊個個數private List<String> blockName;//每一塊名稱private String [] name;public FileSplit(){this.blockName = new ArrayList<String>();}public FileSplit(String filePath){this(filePath,1024);//未知的尺寸則默認1024
    }public FileSplit(String filePath, long blockSize){this();this.filePath = filePath;this.blockSize = blockSize;init();}public String getFilePath() {return filePath;}public void setFilePath(String filePath) {this.filePath = filePath;}public long getBlockSize() {return blockSize;}public void setBlockSize(long blockSize) {this.blockSize = blockSize;}public int getBlockNum() {return blockNum;}public void setBlockNum(int blockNum) {this.blockNum = blockNum;}public List<String> getBlockName() {return blockName;}public void setBlockName(List<String> blockName) {this.blockName = blockName;}private void initBlockName(String destPath){name = new File(filePath).getName().split("\\.");for(int i = 0; i < blockNum; i++){blockName.add(i,destPath + "\\" + name[0] + "_" + i + "." +name[1]);}}public void init(){File src = new File(filePath);//路徑名不存在,或該路徑表示的文件不存,或是文件夾在則結束。if(filePath == null || !src.exists()||src.isDirectory()){return;}if(blockSize >= src.length())this.blockSize = src.length();this.blockNum = (int)Math.ceil(src.length()*1.0/blockSize);}//destPath分割文件存放目錄public void split(String destPath){//分割函數initBlockName(destPath);//初始化分割后的文件名long start = 0;for(int i = 0; i < blockNum; i++){if(i == blockNum - 1)//計算最后一塊大小blockSize = new File(filePath).length()%blockSize;split_m(i,start,blockSize);//參數含義:第i塊,讀取位置,讀取內容大小start += blockSize;//更新起始位置//    System.out.println(start);
        }}//開始分割,每次分割一塊private void split_m(int blockNum,long start,long blockSize){int len = 0;byte[] flush = new byte[1024];RandomAccessFile raf = null;//源文件BufferedOutputStream bos = null;//分割后文件try {bos = new BufferedOutputStream(new FileOutputStream(new File(blockName.get(blockNum))));raf = new RandomAccessFile(new File(filePath),"r");try {raf.seek(start);//確定讀取位置while(-1 != (len = raf.read(flush))){//當前塊分割完成或文件已讀取完跳出循環。//System.out.printf("%d %d %d %s\n",start,blockSize,len,blockName.get(blockNum));if((blockSize - len) >=0){//當前塊大小-寫入字節數,判斷剩余字節bos.write(flush,0,len);//如果塊剩余大小大于讀取字節數,則寫入讀取字節數blockSize -= len;}else{//如果小于,則寫入當前塊剩余字節數bos.write(flush, 0, (int)blockSize);break;//分塊文件已寫滿,跳出當前循環
                    }}bos.flush();bos.close();raf.close();} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}} catch (FileNotFoundException e) {// TODO Auto-generated catch block
            e.printStackTrace();}}public void Merge(String mergePath){//合并文件夾路徑int len;byte[] flush = new byte[1024];InputStream is = null;OutputStream bos = null;for(int i = 0; i < blockNum; i++){try {//每次將一個分割后的文件寫入合并文件中。//寫入方法為追加bos = new BufferedOutputStream(new FileOutputStream(new File(mergePath,"merge." + name[1]),true));is = new BufferedInputStream(new FileInputStream(new File(blockName.get(i))));while(-1 != (len = is.read(flush))){//直到被分割的單個小文件讀取完is.read(flush);//將讀取內容放入flushbos.write(flush,0,len);//將讀取內容寫入文件。
                }bos.flush();bos.close();is.close();//釋放當前資源,下次讀取下一個小文件。} catch (FileNotFoundException e) {// TODO Auto-generated catch block
                e.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch block
                e.printStackTrace();}}}
}
public class Main {public static void main(String[] args){FileSplit f = new FileSplit("F:\\依風\\Desktop\\temp.txt",500);//被分割文件,分割后的字節數f.split("F:\\依風\\Desktop");//分割后小文件的存放位置f.Merge("F:\\依風\\Desktop");//合并后大文件的存放位置}
}

轉載于:https://www.cnblogs.com/huang-changfan/p/9908096.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537542.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537542.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537542.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小米MIUI關閉內容中心通知

被MIUI的內容中心打擾了許久&#xff0c;終于找到徹底關閉它的方式。 這個內容中心&#xff0c;在應用列表里找不到卸載&#xff0c;在通知管理里也找不到&#xff0c;小米把它藏得深。 關閉內容中心通知 第一步&#xff0c;先進入內容中心&#xff0c;然后切換到后臺&#…

python編碼器_自編碼器和分類器python

展開全部 你好&#xff0c;下面是一個keras的softmax分類器自編碼器的python代碼。你需要安裝e5a48de588b662616964757a686964616f31333431343665最新的theano1.0.4才可以跑。import os; os.environ[KERAS_BACKEND] theano import keras from keras.datasets import mnist fro…

Java虛擬機-第二篇-GC算法與內存分配策略

2019獨角獸企業重金招聘Python工程師標準>>> GC引入 在Java的運行時數據區中&#xff0c;程序計數器、虛擬機棧、本地方法棧三個區域都是線程私有的&#xff0c;隨線程而生&#xff0c;隨線程而滅&#xff0c;在方法結束或線程結束時&#xff0c;內存自然就跟著回收…

python在函數內部有沒有辦法定義全局變量_主函數內部的全局變量python

你想要什么是不可能的*。你可以在全局命名空間中創建一個變量&#xff1a; myglobal "UGHWTF" def main(): global myglobal # prevents creation of a local variable called myglobal myglobal "yu0 fail it" anotherfunc() def anotherfunc(): print…

軟件項目經理應該具備的心態

我們&#xff08;項目經理&#xff09;必須認識到有些現實是無法改變的&#xff1a; 1.市場前期都會過度承諾 2.公司是要賺錢的&#xff0c;僅僅有虛名但不賺錢的事情公司是不會真正持久的 3.任何公司都是資源不足的 4.任何公司都有或多或少的管理問題&#xff0c;沒有問題…

Caffe學習記錄(十一) ICNet分割網絡學習

ICNet 是一個既考慮性能&#xff0c;又考慮準確率的分割網絡&#xff0c;包含了語義分割和邊緣精確分割&#xff0c;因為偶然看到就簡單的了解一下&#xff0c;記錄下來 論文是: ICNet for Real_time Semantic Segmentation on High Resolution Images&#xff0c;整篇文章都在…

如何利用python自動化辦公項目_python辦公自動化:自動進行word文檔處理和排版

上節python辦公自動化:自動打開word文檔我們一起學會了在python里打開并保存一個word文檔。這節我們將會學會如何利用python進行文本處理和將其在word里進行排版等技巧。python進行文本處理和將其在word里進行排版等技巧 使用文本 要有效地處理文本&#xff0c;首先要了解一些塊…

不同項目組織結構間的區別

項目組織結構分 職能型 項目型 矩陣型 弱矩陣型 平衡矩陣 強矩陣 職能型 場景舉例&#xff1a; 去飯店吃飯。 飯店A&#xff0c;門口宣傳接待一組人&#xff0c;進店了&#xff0c;換另一組人安排就坐點餐&#xff0c;過一會兒&#xff0c;有專人上菜...... 這是職能型&#x…

PMO在組織結構中的作用

項目管理辦公室是企業設立的一個職能機構名稱&#xff0c;也有的稱作項目管理部、項目辦公室或項目管理中心等&#xff0c;英文為&#xff1a; Project Management Office &#xff0c;縮寫簡稱&#xff1a;PMO。 PMO是在組織內部將實踐、過程、運作形式化和標準化的部門&…

python支持多種編程范式嗎_Python3學習之路~6.1 編程范式:面向過程 VS 面向對象...

編程范式 編程是程序員用特定的語法數據結構算法組成的代碼來告訴計算機如何執行任務的過程&#xff0c;一個程序是程序員為了得到一個任務結果而編寫的一組指令的集合&#xff0c;正所謂條條大路通羅馬&#xff0c;實現一個任務的方式有很多種不同的方式&#xff0c;對這些不同…

Spring框架知識復習之二

Spring使用注解對Bean進行管理 1 使用注解需配置aop相關xsd文件的約束和命名空間 xsd文件名為&#xff1a;spring-aop-4.2.xsd 2 注解組件掃描配置 示例如下&#xff1a;base-package屬性 設置掃描指定包下的所有子孫包 <context:component-scan base-package"cn.itma.…

比較合理的項目組織架構

&#xff08;從自己從業經驗中總結所得&#xff09; PMO就像是操作系統&#xff0c;項目組1...N就像進程&#xff08;開啟多個軟件&#xff09;&#xff0c;項目任務就像線程&#xff0c;項目組成員就像CPU&#xff08;具體干活的&#xff09;&#xff0c;CPU資源是有限的&…

python培訓一般要多久_入門 Python 要多久時間?該如何學習?

入門 Python 要多久?該如何學習? 學Python和學其他的語言其實是相同的&#xff0c;我給新同事講課的時候就說學編程和練武功其實是很相似&#xff0c;入門大致這樣幾步: 找本靠譜的書, 找個靠譜的師傅&#xff0c; 找一個地方開始練習。 學語言也是的&#xff1a;選一本通俗易…

小計 合計 總計 共計 怎么解釋?

排列順序&#xff1a;小計、總計、合計。共計分開使用。 小計&#xff1a;小計就是簡單核算一下單個體&#xff0c;可理解為日小計 合計&#xff1a;合計就是把所有小計加起來&#xff0c;可理解為月合計 總計&#xff1a;總計就是把合計加起來&#xff0c;可理解為年總計 …

巧用位運算存狀態

2019獨角獸企業重金招聘Python工程師標準>>> 某種場景需要,一個事物 有多種狀態并列存在的時候,或者權限,我們可以使用 |,&,~ 來處理,具體代碼如下: package com.example.demo;/*** 權限狀態處理*/ public class StatusUtil {/*** 判斷狀態是否開啟* param fl…

工時單位天與人天的區別?

售前工作時&#xff0c;向甲方提供報價單是必需的&#xff0c;報價要有依據。 當提供的報價單的工時單位是&#xff08;人/天&#xff09;的時候&#xff0c;需要向甲方額外解釋下&#xff0c;人/天人數*天數。比如&#xff1a;編碼開發&#xff0c;40人天&#xff0c;投入1位…

python怎么做項目_聽說你沒有python項目可做,我教你個方法

原標題&#xff1a;聽說你沒有python項目可做&#xff0c;我教你個方法 學習了一段時間的Python&#xff0c;最近出現了“饑荒”&#xff0c;感覺需要多看些代碼&#xff0c;多學習學習別人做些什么&#xff0c;但卻不知道做點什么來進行練習。 說到看代碼&#xff0c;我就想到…

Linux系統CPU相關信息查詢

Linux系統CPU相關信息查詢 作者&#xff1a;尹正杰 版權聲明&#xff1a;原創作品&#xff0c;謝絕轉載&#xff01;否則將追究法律責任。 一.lscpu常用參數介紹 1>.查看幫助信息 [rootnode105 ~]# lscpu -h-a, –all: 包含上線和下線的cpu的數量&#xff0c;此選項只能與選…

excel下拉讓函數參數部分不變

原理 使用相對引用就會變&#xff0c;bai使用絕對引用du就不變 A1是相對引用&#xff0c;上下拉公式的時候會zhi變成A2,A3…… $A$1是行列絕對引用dao&#xff0c;上下拉公式的時候不會變化 $A1&#xff0c;是行絕對引用&#xff0c;上下拉公式的時候會變化&#xff0c;$A2&am…

select * 排除字段_編寫 SQL 的排除聯接

有兩個表&#xff0c;就叫作源表和目標表吧。它們有一個相同的字段&#xff0c;通過該字段可以把源表和目標表關聯在一起&#xff0c;我們希望從源表中檢索到的記錄里的關聯字段的值沒有存在目標表中。舉個例子&#xff0c;源表 dept&#xff0c;目標表 emp&#xff0c;獲取 de…