文档章节

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

东湖畔新家
 东湖畔新家
发布于 2017/05/09 18:53
字数 301
阅读 2
收藏 0

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

本文转载自:http://blog.csdn.net/sblig/article/details/24669889

东湖畔新家
粉丝 1
博文 170
码字总数 31582
作品 0
杭州
后端工程师
私信 提问
Java NIO:IO与NIO的区别

一、概念 NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标...

老菜鸟0217
01/06
0
2
(代码篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝

上一篇讲解了基础文件IO的理论发展,这里结合java看看各项理论的具体实现。 传统IO-intsmaze 传统文件IO操作的基础代码如下: FileInputStream in = new FileInputStream("D:\java.txt");in....

intsmaze(刘洋)
2018/08/01
0
0
Java NIO系列教程(十二) Java NIO与IO

原文地址:http://tutorials.jenkov.com/java-nio/nio-vs-io.html 作者:Jakob Jenkov 当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我...

_夏天的风_
2013/07/11
0
0
java NIO:IO与NIO的区别

一、概念 NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标...

盼望明天
2018/09/11
0
0
今天,Java 12 正式发布了!

自 2 月 7 日开始,Java 12 / JDK 12 就进入了 RC 阶段。按照发布周期,美国当地时间 3 月 19 日,也就是今天——Java 12 正式发布了! Java 12 新特性 Java 12 带来了一系列新特性: 下边分...

CSDN资讯
03/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 程序员做噩梦

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @-冰冰棒- :#今日歌曲推荐# 手嶌葵《Kiss The Girl》 《Kiss The Girl》- 手嶌葵 手机党少年们想听歌,请使劲儿戳(这里) @Sharon啊 :今天...

小小编辑
31分钟前
77
5
Another app is currently holding the yum lock; waiting for it to exit...

Another app is currently holding the yum lock; waiting for it to exit... The other application is: PackageKit Memory : 153 M RSS (266 MB VSZ) Started: Thu Jul 12 00:03......

圣洁之子
39分钟前
2
0
FastDateFormat 研究

FastDateFormat 对缓存的利用,其实就是用ConcurrentHashMap 做了一个map类型的缓存 public F getInstance(final String pattern, TimeZone timeZone, Locale locale) { Validate......

暗中观察
今天
3
0
Android双向绑定原理简述

Android双向绑定原理简述 双向绑定涉及两个部分,即将业务状态的变化传递给UI,以及将用户输入信息传递给业务模型。 首先我们来看业务状态是如何传递给UI的。开启dataBinding后,编译器为布局...

tommwq
今天
4
0
Spring系列教程八: Spring实现事务的两种方式

一、 Spring事务概念: 事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。...

我叫小糖主
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部