需求:
程序仅实现对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”表明这是一个关于TCP协议的项目,特别关注TCP中转功能,客户端(The Client)是用Java语言实现的。这个项目可能涉及创建一个服务器...
为了实现一个中文过滤器,我们可以创建一个继承自`java.io.FilterInputStream`或`java.io.FilterOutputStream`的类。这两个类提供了对输入流和输出流的包装,可以在读写操作前进行额外的处理,比如编码转换。 以下...
这种情况下,通常需要自定义服务器作为中转,两个客户端分别连接到这个服务器,通过服务器转发数据实现通信。 在"源码说明.txt"中,可能详细解释了这些步骤和代码实现,包括如何处理网络权限、异常处理、数据编码...
在IT领域,网络通信是至关重要的部分,而Socket编程则是实现这一目标的关键工具。本示例涉及的是一个Java实现的Socket程序,它能够实现“一对多”端口转发功能,这意味着本地的一个端口可以接收数据并将其转发到多个...
1. 中继模式:客户端A通过服务器发送消息到客户端B,服务器作为消息中转站。客户端A先向服务器发送消息,服务器接收到消息后转发给客户端B。 2. P2P模式:客户端A和B直接建立Socket连接,实现点对点通信。这种方式...
服务器端的实现通常包括创建ServerSocket,监听特定端口,接受连接请求,然后处理客户端发送的数据: ```java try { // 创建ServerSocket,指定监听端口 ServerSocket serverSocket = new ServerSocket(12345); ...
服务器端则扮演着消息中转站的角色,它接收客户端发送的消息并转发给其他在线的客户端。服务器端主要任务包括: 1. 监听客户端连接:使用ServerSocket类开启一个端口,等待客户端的连接请求。 2. 处理连接请求:...
- 一旦连接建立,客户端和服务器可以通过 `Socket` 的 `OutputStream` 和 `InputStream` 进行数据交换。 2. **登录界面**: - 客户端程序包含一个登录界面,用户输入用户名和密码,然后发送到服务器进行验证。 -...
在代码实现中,`Server.java`通常包含`ServerSocket`的创建、`accept()`方法的调用以及`InputStream`的读取,而`Client.java`则包括`Socket`的创建、`OutputStream`的写入操作。在上述示例代码中,教师和学生通过...
另一种方法是自定义下载逻辑,使用`InputStream`从服务器读取数据,然后写入到`OutputStream`,保存到本地文件系统。 7. **权限管理**:Android 6.0及以上版本需要在运行时请求`READ_EXTERNAL_STORAGE`和`WRITE_...
作为信息的中转站,服务器负责接收所有客户端发送的信息,并根据需求将信息转发至相应的接收者。而客户端则需要创建一个`Socket`,连接到服务器,发送信息并接收来自服务器的消息。 二、聊天系统的测试与运行 1. ...
在处理网络请求时,我们可能需要设置代理服务器来中转这些请求,这在企业级应用、测试自动化或网络爬虫等场景中非常常见。 1. **Java代理设置**:在Java中,可以通过系统属性或URL对象来设置代理。例如,我们可以...
- **InputStream/OutputStream**(字节流):一次处理一个字节。 - **Reader/Writer**(字符流):一次处理一个字符。 这些类提供了丰富的功能,如文件读写、数据格式转换等,并且具有良好的可扩展性和灵活性。 ##...