`
cn_arthurs
  • 浏览: 327039 次
  • 性别: 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);
		}
	}
}

 

 

 

分享到:
评论

相关推荐

    Based-on-the-TCP-client-and-server.rar_TCP中转_The Client_java Tcp

    标题中的“Based-on-the-TCP-client-and-server.rar_TCP中转_The Client_java Tcp”表明这是一个关于TCP协议的项目,特别关注TCP中转功能,客户端(The Client)是用Java语言实现的。这个项目可能涉及创建一个服务器...

    转换中文的过滤器(java 中转换中文)

    为了实现一个中文过滤器,我们可以创建一个继承自`java.io.FilterInputStream`或`java.io.FilterOutputStream`的类。这两个类提供了对输入流和输出流的包装,可以在读写操作前进行额外的处理,比如编码转换。 以下...

    安卓Android源码——Socket的客户端通信.zip

    这种情况下,通常需要自定义服务器作为中转,两个客户端分别连接到这个服务器,通过服务器转发数据实现通信。 在"源码说明.txt"中,可能详细解释了这些步骤和代码实现,包括如何处理网络权限、异常处理、数据编码...

    socket一对多端口转发源码

    在IT领域,网络通信是至关重要的部分,而Socket编程则是实现这一目标的关键工具。本示例涉及的是一个Java实现的Socket程序,它能够实现“一对多”端口转发功能,这意味着本地的一个端口可以接收数据并将其转发到多个...

    android客户端加服务端的socket长连接

    1. 中继模式:客户端A通过服务器发送消息到客户端B,服务器作为消息中转站。客户端A先向服务器发送消息,服务器接收到消息后转发给客户端B。 2. P2P模式:客户端A和B直接建立Socket连接,实现点对点通信。这种方式...

    Socket简单代码

    服务器端的实现通常包括创建ServerSocket,监听特定端口,接受连接请求,然后处理客户端发送的数据: ```java try { // 创建ServerSocket,指定监听端口 ServerSocket serverSocket = new ServerSocket(12345); ...

    java写的tcp局域网聊天工具

    服务器端则扮演着消息中转站的角色,它接收客户端发送的消息并转发给其他在线的客户端。服务器端主要任务包括: 1. 监听客户端连接:使用ServerSocket类开启一个端口,等待客户端的连接请求。 2. 处理连接请求:...

    Java. 案例.1.QQ项目文档,挺实在的案例,可以当练习

    - 一旦连接建立,客户端和服务器可以通过 `Socket` 的 `OutputStream` 和 `InputStream` 进行数据交换。 2. **登录界面**: - 客户端程序包含一个登录界面,用户输入用户名和密码,然后发送到服务器进行验证。 -...

    JAVA即时通信系统

    在代码实现中,`Server.java`通常包含`ServerSocket`的创建、`accept()`方法的调用以及`InputStream`的读取,而`Client.java`则包括`Socket`的创建、`OutputStream`的写入操作。在上述示例代码中,教师和学生通过...

    androidjava源码下载-Downloadfile:下载PHP中转换为pdf的MYSQL文件并通过androidjava下载的源代码

    另一种方法是自定义下载逻辑,使用`InputStream`从服务器读取数据,然后写入到`OutputStream`,保存到本地文件系统。 7. **权限管理**:Android 6.0及以上版本需要在运行时请求`READ_EXTERNAL_STORAGE`和`WRITE_...

    JAVA编写QQ聊天系统指导书.doc

    作为信息的中转站,服务器负责接收所有客户端发送的信息,并根据需求将信息转发至相应的接收者。而客户端则需要创建一个`Socket`,连接到服务器,发送信息并接收来自服务器的消息。 二、聊天系统的测试与运行 1. ...

    JavaProx多项目多工程代理HttpUrlConnection

    在处理网络请求时,我们可能需要设置代理服务器来中转这些请求,这在企业级应用、测试自动化或网络爬虫等场景中非常常见。 1. **Java代理设置**:在Java中,可以通过系统属性或URL对象来设置代理。例如,我们可以...

    JAVANIO简介.pdf

    - **InputStream/OutputStream**(字节流):一次处理一个字节。 - **Reader/Writer**(字符流):一次处理一个字符。 这些类提供了丰富的功能,如文件读写、数据格式转换等,并且具有良好的可扩展性和灵活性。 ##...

Global site tag (gtag.js) - Google Analytics