`

io之自定义InputStream

    博客分类:
  • java
阅读更多
package com.laien.io;

import java.io.IOException;
import java.io.InputStream;

/**
 * 自定义InputStream,节点流
 * 
 * @author Administrator
 *
 */
public class MyByteArrayInputStream extends InputStream {
	protected byte[] arr; // 数据源
	protected int ptr = 0; // 当前指针
	protected int mark=0;//标记
	
	/**
	 * 构造函数,接收输入的字节数组
	 * @param arr
	 */
	public MyByteArrayInputStream(byte[] arr) {
		this.arr = arr;	
	}

	/**
	 * 抽象方法,必须实现
	 */
	@Override
	public int read() throws IOException {
		//当读到没有数据后,会返回-1
		return (ptr < arr.length) ? arr[ptr++] : -1;
	}

	/**
	 * 可读数据长度
	 */
	@Override
	public int available() throws IOException {
		return arr.length - ptr;
	}
	
	@Override
	public void close() throws IOException {
		ptr = arr.length;
	}
	/**
	 * 标记,与reset相应
	 */
	@Override
	public synchronized void mark(int readlimit) {
		this.mark = readlimit;
	}
	
	@Override
	public synchronized void reset() throws IOException {
		if (this.mark<0 || this.mark >= arr.length) {
			throw new IOException("标识不对");
		}
		
		ptr = mark;//指针重新指到mark位置,让流可以重新读取
	}
	/**
	 * 重写方法 
	 */
	@Override
	public int read(byte[] b, int off, int len) throws IOException {
		if (ptr >= arr.length || len <0) {
			//流已读完
			return -1;
		}
		
		if (len == 0) {
			return 0;
		}
		
		//处理最后一次读取的时候可能不没有len的长度,取实际长度
		len = available() < len ? available() : len;
		
		System.arraycopy(arr, ptr, b, off, len);
		
		ptr += len;
		//返回读取的长度
		return len;
	}
	
	public static void main(String[] args) throws IOException {
		//测试
		
		byte[] source = new byte[10];
		for (int i=0; i<source.length; i++) {
			source[i] = (byte)i;
		}
		
		MyByteArrayInputStream mis = new MyByteArrayInputStream(source);
		
		byte[] buff = new byte[4];	//
		int len =0;
		while(-1 != (len = mis.read(buff, 0, buff.length))) {
			for (int i=0; i<len; i++) {
				System.out.print(buff[i]);
			}
			System.out.println();
		}
		
	}
	
	
}

 

分享到:
评论

相关推荐

    springboot 解决InputStream只能读取一次的问题

    在自定义的`ServletInputStream`中实现`isReady()`、`setReadListener(ReadListener)`等相关方法以保持兼容性。 最后,为了在Spring Boot中使用这个自定义的`HttpServletRequestWrapper`,我们需要在适当的拦截器或...

    Java IO commons-io-2.5.jar

    Java IO 包含了许多类,如InputStream、OutputStream、Reader、Writer等,它们分别用于处理字节流和字符流。字节流适用于二进制数据,而字符流适用于文本数据。Java IO 还包括Filter流,可以用来装饰其他流,添加...

    INPUTSTREAM

    "工具" 标签可能意味着博客作者讨论了如何利用 `InputStream` 类进行数据处理,或者介绍了与之相关的实用工具类和技巧,例如使用 `InputStream` 进行文件上传、网络数据接收等。 根据提供的文件名 `InputStream....

    java socket通信自定义消息协议

    自定义消息协议是在标准TCP/IP协议之上,根据具体需求设计的一种数据传输格式。本篇将详细讲解如何在Java中实现基于Socket的自定义消息协议,以及客户端与服务器端的数据转换与解析过程。 首先,我们来看`Socket...

    commons-io-2.4

    - **IO异常处理**:提供了一些自定义的IOException子类,使得异常处理更加精确。 - **线程安全的缓冲流**:如BufferedInputStream和BufferedOutputStream,提高了IO操作性能。 - **文件观察**:可以监听文件系统事件...

    map集合以及IO流

    1. **字节流**:处理原始的字节数据,包括`InputStream`和`OutputStream`作为抽象基类,以及它们的子类如`FileInputStream`和`FileOutputStream`。字节流适用于处理任何类型的二进制数据,如图片、音频文件等。 2. ...

    commons-io-1.3.2.jar

    Apache Commons IO是很多Maven插件的依赖之一,因为插件在处理源代码、资源文件和构建输出时,需要进行各种I/O操作。 在Maven项目中,添加Apache Commons IO作为依赖,可以通过以下方式在pom.xml文件中声明: ```...

    推荐一款好用的JAVA IO分析工具JPicus

    Java的IO库包含了多种类和接口,如InputStream、OutputStream、Reader、Writer等,它们构成了处理输入和输出的核心框架。这些类用于读写文件、网络流、系统属性等,而JPicus就是用来监测这些操作的效率和性能的。 ...

    通过IO流把文件传到前端并下载.zip

    总结起来,这个场景涉及到Java IO流的使用,Servlet的文件传输,Spring框架的HTTP请求处理,以及一些辅助库和自定义工具类。理解这些核心概念和技术,对于实现“通过IO流把文件传到前端并下载”的功能至关重要。

    commons-io-1.4.rar_commons io_commons-io-1.4_commons-io-1.4.jar

    2. **流操作**:IO组件的核心在于对流的处理,如`InputStream`和`OutputStream`。`StreamUtils`和`IOUtils`提供了一些便捷的方法,如`copy()`方法可以方便地在不同类型的流之间进行数据复制。 3. **缓冲区操作**:`...

    JAVA自定义异常类

    import java.io.InputStream; import java.util.Scanner; public class Month { private static int month; public static void main(String[] args) { System.out.println("请输入月份:"); Scanner input = ...

    IO各种操作文件,字符流、字节流等

    在上传和下载文件时,通常涉及到网络IO,Java提供了Socket和ServerSocket类处理客户端和服务器之间的连接,而InputStream和OutputStream则负责数据传输。此外,HTTP协议的文件上传下载可以使用HttpURLConnection或者...

    commons-io-2.0.1

    这个版本提供了大量静态工厂方法来创建InputStream、OutputStream、Reader、Writer等流对象,以及用于处理文件、目录、字符串缓冲、系统属性、线程局部存储和网络连接的工具类。 1. **文件操作**:Commons IO 提供...

    commons-fileupload组件和commons-io组件

    5. **文件存储策略**:可以自定义存储策略,例如将文件直接保存到服务器的指定目录,或者通过流式处理将文件内容传递给其他处理程序。 **Commons-IO组件** Apache Commons-IO则是另一个非常重要的工具库,它提供了...

    commons-io.jar

    例如,`IOUtils.toString()`可以从InputStream中读取内容并转换为字符串,而`IOUtils.copy()`可以将一个流的内容复制到另一个流。 3. **字符集转换**:在处理文本文件时,字符集转换经常需要。Apache Commons IO...

    java jdk io包类详解

    - `Externalizable`: 允许对象自定义序列化和反序列化行为。 - `FileFilter`: 用于过滤文件。 - `FilenameFilter`: 用于过滤文件名。 - `ObjectInputValidation`: 用于验证反序列化的对象。 2. **类** - `...

    commons-io-1.4-源码跟jar

    `IOUtils.toString()`方法可以从InputStream或Reader中读取内容并返回一个字符串。 3. 文件过滤器:允许通过实现或使用预定义的过滤器(如`FileNameFilter`和`DirectoryFilter`)来选择性地处理文件或目录。这在...

    java IO流学习笔记

    例如,自定义一个年龄超出范围的异常类`AgeOutOfBoundsException`,并在合适的地方抛出: ```java class AgeOutOfBoundsException extends Exception { public AgeOutOfBoundsException() { super(); } ...

Global site tag (gtag.js) - Google Analytics