`
cn_arthurs
  • 浏览: 321964 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

InputStream中转实现

 
阅读更多

需求:

程序仅实现对InputStream的中转,传入InputStream,传出依然是InputStream。

 

思路:

一般情况下,InputStream负责读,OutputStream负责写。为了不在本地产生任何数据文件,只能使用两个InputStream对接,从A读出后,再读到B里去,同时为了程序的高效,不能一次性将A的流数据全部读出,否则容易导致内存溢出,因此,需要分段读取。

 

实现:

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Splitter {
	private InputStream inputStream;
	private long size;
	private int realBlocksize=1024*1024; //1M
	private long curLocation = 0;
	private byte[] buffer;
	/**
	 * 
	* @param size			数据流总大小
	* @param inputStream	数据流对象
	* @param blocksize		分块大小
	* @param mincount		最小拆分数
	 */
	public Splitter(long size, InputStream inputStream, int blocksize,int mincount) {
		this.size = size;
		this.inputStream = inputStream;
		if (size < mincount*blocksize) {
			realBlocksize = (int) (size / mincount);
		}
		if (realBlocksize == 0) {
			realBlocksize = (int) blocksize;
		}
		buffer = new byte[realBlocksize];
	}

	public byte[] getBuffer() {
		return buffer;
	}

	public int splite() {
		int re = 0;
		if (curLocation >= size) {
			return re;
		}
		try {
			re = inputStream.read(buffer);
			curLocation += re;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return re;
	}
	public static void main(String[] args) throws Exception {
		File f = new File("F:\\test.zip");
		FileInputStream in = new FileInputStream(f);
		Splitter splitter = new Splitter(f.length(), in, 1024*1024,2);
		int blockIndex=0;
		while (true){
			int readSize = splitter.splite();
			if (readSize == 0) {
				break;
			}
			byte[] readBuffer = splitter.getBuffer();
			InputStream readinput=new ByteArrayInputStream(readBuffer,0,readSize);
		}
	}
}

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics