日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > php教程 > 文件分割器的實現(xiàn)

文件分割器的實現(xiàn)

來源:程序員人生   發(fā)布時間:2017-02-03 14:47:42 閱讀次數(shù):2637次

記得讀高中的時候特別喜歡看電子書,但是那時候還是2010年的時候,經(jīng)濟條件不好,買不起智能手機,只能使用1些山寨機,硬件設(shè)施較差,里面的txt文本瀏覽器只能讀取大小不超過5M的電子書,但是網(wǎng)上的電子書基本上都超過了5M,為了能看這些書,只能在網(wǎng)上下載1個txt文件分割器,分割成小文件后,再下載得手機上,那時候還不懂編程,就覺得這個分割器是1個很奇異的東西。但是如今自己學(xué)了編程后發(fā)現(xiàn)1個文件分割器是10分容易實現(xiàn)的。

現(xiàn)在筆者就以Java中的IO流知識,實現(xiàn)1個文件分割器,固然知識實現(xiàn)了核心的代碼,沒有實現(xiàn)界面,畢竟Java中的Swing包做出來的界面不是那末好看,筆者對這1塊知識也沒有深入學(xué)習(xí)。

要想將1個文件分割,首先要知道將文件分成大小為多少的塊(或分成幾塊,筆者在這里只以每塊的大小舉例),例如我們要將1個大小為324個字節(jié)大小的文件分割成每塊大小為100個字節(jié)的小文件,那末就需要將文件分成4塊,且最后1塊的實際大小為24。固然也會遇到這類情況,文件為324個字節(jié),而要將文件分割成大小為400個字節(jié)的塊,那末這個塊的實際大小為324。


將文件分割好塊后,接下來我們就需要將每個小塊寫出到磁盤中。首先我們得用RandomAccessFile來讀取文件到內(nèi)存當中,利用seek方法設(shè)置從哪兒開始讀取,然后用FileOutputStream來將讀取到的內(nèi)容寫出到磁盤中。但是在寫出的時候,會遇到這樣1個問題:每次讀取的長度len可能大于每塊的實際大小(例如該塊的實際大小為100,而len卻為120,這時候候就不能將讀取到的內(nèi)容全部寫出),因此需要判斷,具體可以看下面的代碼中的注釋。


具體的代碼以下:

package com.tiantang.split;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;

public class SplitFile {
	
	//被分割文件的路徑
	private String srcPath;
	//被分割的文件對象
	private File src;
	//分割的塊數(shù)
	private int size;
	//每塊的大小
	private long blockSize;
	//每塊的實際大小
	private long actualBlockSize;
	//原文件的長度
	private long length;
	//分割得到的文件名的集合
	private List<String> splitFileNames=new ArrayList<String>();
	
	public SplitFile(String srcPath,long blockSize){
		this.srcPath=srcPath;
		this.blockSize=blockSize;
		init();
	}
	
	/**
	 * 初始化文件分隔需要用到的參數(shù)
	 */
	private void init(){
		//路徑為空,則拋出異常
		if(srcPath==null){
			throw new RuntimeException("文件路徑不合法");
		}
		
		src=new File(srcPath);
		
		//文件是不是存在
		if(!src.exists()){
			throw new RuntimeException("文件不存在");
		}
		//是不是是文件夾
		if(src.isDirectory()){
			throw new RuntimeException("不能分割文件夾");
		}
		
		//如果文件存在
		length=src.length();
		
		if(length<this.blockSize){
			this.blockSize=length;
		}
		
		//計算分割的塊數(shù)
		size=(int) ((length⑴)/this.blockSize+1);
		//初始化分割后的文件名集合
		initSplitFileNames();
	}

	/**
	 * 初始化文件被分割后新生成文件的名字
	 * 格式為:原文件名+第幾塊+擴大名
	 */
	private void initSplitFileNames() {
		//文件的全名(包括后綴)
		String fileName=src.getName();
		//取得文件的擴大名前的分隔符‘.’
		int index=fileName.indexOf('.');
		//文件名的前綴
		String prefixName=fileName.substring(0,index );
		//文件名的后綴
		String extName=fileName.substring(index);
		for(int i=0;i<size;i++){
			splitFileNames.add(prefixName+(i+1)+extName);
		}
	}
	
	/**
	 * 文件分割的詳細細節(jié)
	 */
	public void split(){
		RandomAccessFile raf=null;
		OutputStream os=null;
		try {
			raf=new RandomAccessFile(src,"r");
			byte[] b=new byte[1024];
			int len=0;
			for(int i=0;i<size;i++){
				raf.seek(blockSize*i);
				
				//計算最后1塊的實際大小
				if(i==(size⑴)){
					actualBlockSize=length-blockSize*(size⑴);
				}else{
					actualBlockSize=blockSize;
				}
				
				os=new BufferedOutputStream(new FileOutputStream(new File(src.getParent(),splitFileNames.get(i))));
				while(⑴!=(len=raf.read(b))){
					//如果讀取的長度已超過了實際的長度,則只需要寫實際長度的數(shù)據(jù)
					if(len>=actualBlockSize){
						os.write(b, 0, (int) actualBlockSize);
						os.flush();
						break;
					}else{
						os.write(b, 0, len);
						os.flush();
						actualBlockSize-=len;
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(os!=null){
				try {
					os.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(raf!=null){
				try {
					raf.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
		}
	}
	
	//測試
	public static void main(String[] args) {
		SplitFile sf=new SplitFile("F:\\test\\tiantang\\java1\\TestException.java",200);
		sf.split();
	}

}
這樣我們就實現(xiàn)了文件的分割,至于文件的合并的思路則是順次將文件讀到內(nèi)存中,然后將文件利用 new FileOutputStream(destPath,true)將文件寫出,注意該對象的第2個參數(shù)需要指定為true,只要這樣才能是將文件追加寫入,否則將是覆蓋

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 日韩久久视频 | 国产在线不卡视频 | 午夜噜噜噜 | 精品综合久久久 | 国产男女视频 | 粉嫩粉嫩看着都硬av | 天堂在线视频免费 | 金瓶狂野欧美性猛交xxxx | 久久xx| 麻豆国产一区二区三区四区 | 欧美日韩精品一区二区在线播放 | 国产精品一区二区久久 | 精精国产 | 香蕉看片 | 色婷婷精品国产一区二区三区 | 国产操片 | 久久久久久久国产 | 在线观看中文字幕国产 | 99国产精品国产精品久久 | 欧美一区二区在线观看 | 蜜乳av网站 | 午夜成人在线视频 | 一级女性全黄久久生活片免费 | 中国一级特黄毛片大片 | 午夜在线免费观看视频 | 欧美日韩电影一区 | 在线观看国产麻豆 | 久久亚洲一区 | 久久99网 | 亚洲88| 欧美日韩精品免费观看视频 | 91嫩草影视 | 国产精品福利片 | 中文字幕在线观看av | jizz韩国 | 国产精品99久久久久 | 中文字幕无线精品亚洲乱码一区 | 免费大片黄在线观看视频网站 | 国产在线视频一区 | 欧美福利专区 | 亚洲丁香社区久久丝袜综合网 |