`

JAVA实现位流缓冲区--更改

    博客分类:
  • java
 
阅读更多

import java.io.InputStream;

public final class BitStream {
	private  final int RESELEN = 4096;//默认缓冲区大小
	private  InputStream  in;//输入流
	private byte[] bitBuf;//提高处理 缓冲区
	private int bitPos; //位位置
	private int bytePos;//字节位置
	private int endPos; //bitBuf已填入的字节数  

	public BitStream(InputStream  in) {
		
		this.in = in;
		bitBuf = new byte[RESELEN + 4]; // 长度不小于(最大帧长)  
		
	}
	
	public BitStream(InputStream  in,int size) {
		
		this.in = in;
		bitBuf = new byte[size + 4]; // 长度不小于size(最大帧长)  
	}
	/**
	 * <p>
	 * 简述:向bitBuf添加len字节,RESELEN后尾部要空出4字节用于32bit的"2级缓冲". 
	 * </p>
	 */
	public int append(int len) {
		if (len + endPos > RESELEN) {
			//将缓冲区bytePos及之后的字节移动到缓冲区首  
			System.arraycopy(bitBuf, bytePos, bitBuf, 0, endPos
					- bytePos);
			endPos -= bytePos;
			bitPos = bytePos = 0;
		}
		try {
			if(in.read(bitBuf, endPos, len)==-1)
				return -1;  
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}

		endPos += len;
		return len;
	}
	/**
	 * <p>
	 * 简述:重置 bitstream
	 * </p>
	 */
	public void resetIndex() {
		bytePos = bitPos = endPos = 0;
	}
	/**
	 * <p>
	 * 简述:从缓冲区bitBuf读取1 bit
	 * </p>
	 */
	public int get1Bit() {
		int bit = bitBuf[bytePos] << bitPos;
		bit >>= 7;
		bit &= 0x1;
		bitPos++;
		bytePos += bitPos >> 3;
		bitPos &= 0x7;
		return bit;
	}
	/**
	 * 
	 * <p>
	 * 简述:2 <= n <= 17 
	 * </p>
	 */
	public int getBits17(int n) {
		int iret = bitBuf[bytePos];
		iret <<= 8;
		iret |= bitBuf[bytePos + 1] & 0xff;
		iret <<= 8;
		iret |= bitBuf[bytePos + 2] & 0xff;
		iret <<= bitPos;
		iret &= 0xffffff; // 高8位置0;  
		iret >>= 24 - n;
		bitPos += n;
		bytePos += bitPos >> 3;
		bitPos &= 0x7;
		return iret;
	}
 http://lfp001.iteye.com/blog/412745
分享到:
评论
1 楼 sblig 2011-11-22  
/**
	 * 
	 * <p>
	 * 简述:2 <= n <= 33 
	 * </p>
	 */
	public int getBits33(int n) {
		int iret = bitBuf[bytePos];
		iret <<= 8;
		iret |= bitBuf[bytePos + 1] & 0xff;
		iret <<= 8;
		iret |= bitBuf[bytePos + 2] & 0xff;
		iret <<= 8;
		iret |= bitBuf[bytePos + 3] & 0xff;
		iret <<= bitPos;
		iret &= 0xffffffff; // 高32位置0;  
		iret >>= 32 - n;
		bitPos += n;
		bytePos += bitPos >> 3;
		bitPos &= 0x7;
		return iret;
	}

	/**
	 * 
	 * <p>
	 * 简述: 2<= n <= 9 
	 * </p>
	 */
	public int getBits9(int n) {
		int iret = bitBuf[bytePos];
		iret <<= 8;
		iret |= bitBuf[bytePos + 1] & 0xff;
		iret <<= bitPos;
		iret &= 0xffff; // 高16位置0;  
		iret >>= 16 - n;
		bitPos += n;
		bytePos += bitPos >> 3;
		bitPos &= 0x7;
		return iret;
	}
	public int getBytePos() {
		return bytePos;
	}
	public int getBuffBytes() {
		return endPos;
	}
	public int getBitPos() {
		return bitPos;
	}
	/** 
	 * 返回值是0-255的无符号整数 
	 */
	public int get1Byte() {
		return bitBuf[bytePos++] & 0xff;
	}
	/**
	 * <p>
	 * 简述: 回跳 n 个位
	 * </p>
	 */
	public void backBits(int n) {
		bitPos -= n;
		bytePos += bitPos >> 3;
		bitPos &= 0x7;
	}
	/**
	 * <p>
	 * 简述:跳转 nbtyes 个字节
	 * </p>
	 */
	public void skipBytes(int nbytes) {
		bytePos += nbytes;
		bitPos = 0;
	}
}

相关推荐

    java面试——深圳-OPPO-Java高级.zip

    - NIO(非阻塞I/O):选择器、通道、缓冲区的概念,以及其相对于传统IO的优势。 5. **反射与注解**: - 反射机制:动态获取类信息,创建对象,调用方法,修改属性,以及反射在设计模式中的应用。 - 注解:元数据...

    java源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java文件与流操作code

    在Java中,I/O(输入/输出)系统是通过流(Stream)的概念来设计的,流是数据传输的抽象表示,可以是文件、网络连接、内存缓冲区等。下面将详细解释Java中的文件操作和流技术。 1. **Java I/O基础** - Java的I/O库...

    Java语言编写的数据结构-队列实现

    - **缓冲区管理**:在网络传输或I/O操作中,缓冲区通常采用队列结构来暂存数据。 - **打印机作业**:多个打印任务可以按到达顺序放入队列,等待逐个打印。 - **广度优先搜索(BFS)**:在图或树的搜索算法中,...

    java 输入输出流

    3. **缓冲流**:为了提高性能,Java提供了缓冲流,如`BufferedReader`和`BufferedWriter`,它们在底层字节或字符流之上添加了一个缓冲区,减少了对底层资源的频繁访问。 4. **过滤流**:过滤流是在已存在的流基础上...

    Java入门缓冲区溢出编程心得

    ### Java入门缓冲区溢出编程心得 #### 缓冲区溢出原理与实践 缓冲区溢出是一种常见的安全漏洞,通常发生在程序试图将过多的数据写入一个固定大小的内存区域时。这种行为可能会覆盖相邻的内存空间,从而导致程序...

    java私塾全笔记+1-15章pdf

    - **字节流与字符流**:InputStream、OutputStream、Reader、Writer的基本用法,以及Buffered系列流的缓冲功能。 - **对象序列化**:理解序列化机制,如何实现Serializable接口,以及反序列化的操作。 6. **多...

    (超赞)JAVA精华之--深入JAVA API

    - **缓冲区流** - `BufferedInputStream` 和 `BufferedOutputStream` 在文件流的基础上添加了缓冲功能,提高了读写效率。 - **原始型数据流** - `DataInputStream` 和 `DataOutputStream` 提供了读写基本数据类型...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧...

    java字符流练习-电话本管理系统

    为了提高效率,开发人员可能会在它们之上包装BufferedReader和BufferedWriter,利用缓冲区批量处理数据。 接着,电话本管理的核心功能之一是搜索联系人。这可能涉及到对文件内容的遍历和解析,可能使用readLine()...

    java模拟实现PV操作

    在多线程环境下,生产者和消费者都可能同时运行,因此需要一种机制来协调它们,使得当缓冲区满时生产者暂停生产,当缓冲区空时消费者停止消费,这就是PV操作的作用。 在Java中,`wait()`和`notify()`方法是`Object`...

    inotify-java-2.1源码.rar

    源码中还包含了一些辅助类,如`InotifyBuffer`用于管理与内核交互的数据缓冲区,`InotifyFlags`枚举类型列出了所有可能的inotify事件标志,以及一些测试用例帮助验证库的功能。 总的来说,`inotify-java-2.1`源码...

    Java输入输出流

    - **`BufferedReader` 和 `BufferedWriter`**:分别用于读取和写入文件中的字符数据,它们通常用于提高性能,因为它们内部使用了缓冲区来减少对底层系统的访问次数。 - **`PipedInputStream` 和 `PipedOutputStream`...

    Java2023面试突击八股文-(八股文)

    - **缓冲流**:BufferedInputStream和BufferedOutputStream等提高读写效率。 - **转换流**:InputStreamReader和OutputStreamWriter用于字节流和字符流之间的转换。 - **对象序列化**:Serializable接口,将对象...

    java-core-learning-example-master.zip

    8. **I/O流体系**:Java的I/O流处理能力强,包括字符流和字节流,以及缓冲流、转换流和对象流等,方便进行输入输出操作。 9. **网络编程(Network Programming)**:Java提供了丰富的网络编程API,如Socket和...

    java学习笔记之Java-IO操作共19页.pdf.zi

    - 按处理单位:字节流(8位),字符流(16位,基于Unicode)。 - 按流向与处理单位组合:字节输入流(如FileInputStream)、字节输出流(如FileOutputStream)、字符输入流(如BufferedReader)、字符输出流(如...

    Java 输入输出流 源码

    BufferedReader和BufferedWriter用于提高读写效率,通过缓冲区批量处理数据。 4. **转换流**:InputStreamReader和OutputStreamWriter是字节流与字符流之间的桥梁,可以实现两者之间的转换,方便在处理字节数据时...

    优质课件 入门必看 清华大学出版 Java程序设计 第7章-文件与数据流(共114页).ppt

    为了提高效率,Java提供了带缓冲的流,如`BufferedInputStream`和`BufferedOutputStream`,它们在内部维护了一个缓冲区,减少了与底层设备的交互次数。 #### 1.6 标准输入输出流的重定向 Java允许程序员重定向标准...

    java的输入输出流

    对于输出流,OutputStream类是所有字节输出流的基类,包含write(int)、close()和flush()方法,分别用于写入字节、关闭流和清空缓冲区。例如,FileOutputStream是用于向文件写入字节的输出流,同样有多种构造方式以...

Global site tag (gtag.js) - Google Analytics