当前位置: 首页 > news >正文

InputStream类的实现

我们知道,java是一种解释型的语言。它的虚拟机帮助我们把.class文件变成机器能够识别的机器语言。

当然,做为一个应用层开发的程序员,我们没必要去看JVM的实现代码,如果你有兴趣写自己的虚拟机,自己写一种新的语言出来,你也可以去看。

我们现在关心的是:在JVM规范的基础上的java基本类库的实现机制,从而从本质上认识到java语言的规范和功能。

因为最近一直在做网络通讯相关的东西,这里也给大家解释一下自己对通讯协议的认识:

其实所谓的通讯协议,就是双方约定俗成的一些规范和需要完成的一些功能,当然,如果有兴趣,你同样也可以开发属于自己的通讯协议。不过这个工作就比较麻烦了,要有差错管理,流量控制,数据校验等复杂的过程。如果你是从事协议开发的,那就另说了。我们学java的当然没必要来了解这些,因为底层的一些东西往往是用更加低级的语言来完成的,以方便和机器的操作。

这和我们的IE浏览器很相似,因为它也按照约定和实现方法接受HTML格式的数据流,然后解析显示出来。同样,我们的手机浏览器也只能解析WML格式的数据流。如果可能,你也可以开发出一种解析HTML格式数据流的手机浏览器。这就是通讯的本质,通讯的双方按照约定俗成的东西去交流信息。

在我们的工作中,一般没必要去改写这些底层的通讯协议和其功能。我们要做的就是把附加的数据信息增加到相应的数据包中。在端对端的开发中,另外一端再逐层的解析数据包,把附加信息一层层的过滤,最终得到我们想要的东西。然后做界面的刷新,这就是所谓的网络通讯。其实没什么神秘性,只要你从低层上了解了它,很简单,也很容易操作。

其实做网络游戏也一样,Client和Server按照实现约定好的协议把附加的信息追加到数据包的头部或者数据实体内(具体视通讯方法不同而不同)。然后双方通过不断的解析和发送约定格式的数据包来进行通讯和界面的刷新。

我们先看J2SE自带的InputStream的源码:

package java.io; //所处的位置,因此我们在用的时候要import导入

public abstract class InputStream { //很明显是个抽象类,因此不能new一个InputStream出来


private static final int SKIP_BUFFER_SIZE = 2048;
private static byte[] skipBuffer;

public abstract int read() throws IOException;

public int read(byte b[], int off, int len) throws IOException {
if (b == null) { //如果传入的字节数组为空,抛出NullPointerException异常,因此这个方法应该用在try{}里
throw new NullPointerException();
} else if ((off < 0) || (off > b.length) || (len < 0) ||

((off + len) > b.length) || ((off + len) < 0)) {//一些出界的可能性,如果出界抛出异常
throw new IndexOutOfBoundsException();
} else if (len == 0) {//如果你要读的数据长度为0,那么read()方法返回0,什么也读不到
return 0;
}

int c = read();
if (c == -1) { //如果偏移量超出字节数组b时,此方法返回-1

return -1;
}
b[off] = (byte)c; //从此可见read方法是从off位置可以正式读取的,即:off位置的元素属于read读的第一个

int i = 1;
try {
for (; i < len ; i++) {
c = read();
if (c == -1) {
break;
}
if (b != null) {
b[off + i] = (byte)c;
}
}
} catch (IOException ee) {
}
return i; //返回的是读取到的字节数
}

public int read(byte b[]) throws IOException { //重载上面的方法
return read(b, 0, b.length);
}

public long skip(long n) throws IOException {

long remaining = n;
int nr;
if (skipBuffer == null)
skipBuffer = new byte[SKIP_BUFFER_SIZE];

byte[] localSkipBuffer = skipBuffer;

if (n <= 0) {
return 0;
}

while (remaining > 0) {
nr = read(localSkipBuffer, 0,
(int) Math.min(SKIP_BUFFER_SIZE, remaining));
if (nr < 0) {
break;
}
remaining -= nr;
}

return n - remaining;
}

public int available() throws IOException {
return 0;
}

public void close() throws IOException {}

public synchronized void mark(int readlimit) {}

public synchronized void reset() throws IOException {
throw new IOException("mark/reset not supported");
}

public boolean markSupported() {
return false;
}

}

相关文章:

  • 多重背包单调队列优化思路_多重背包的单调队列优化
  • 印章QQ头像
  • xcorr函数原理_matlab中的xcorr 自相关函数
  • IT == 网管?
  • android finish 判断当前_最常用的Activity的onBackPressed()与finish()的区别.
  • 一切艺术与伟业的奥妙——专心!
  • axis1 c# 接口 调用_Tomcat6.0+Jdk1.5+Axis1.3搭建java webservice环境,并使用c#调用该服务。...
  • 开发基于ASP.NET的自定义日志系统
  • mysql 几级缓存_mysql缓存:一级缓存和二级缓存
  • HTTP 1.1与HTTP 1.0的比较
  • mysql 中一个表里有父子关系_SQLAlchemy - 同一个表中的父子关系
  • c mysql锁_mysql三种锁
  • 文献管理软件使用[keep updating]
  • The 25 Worst Tech Products of All Time
  • 电脑mac地址会变吗_怎么查询电脑mac地址
  • 【知识碎片】第三方登录弹窗效果
  • 2019年如何成为全栈工程师?
  • android图片蒙层
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • HTML-表单
  • httpie使用详解
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Java到底能干嘛?
  • JSDuck 与 AngularJS 融合技巧
  • Laravel 菜鸟晋级之路
  • ng6--错误信息小结(持续更新)
  • oschina
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Zsh 开发指南(第十四篇 文件读写)
  • 阿里云应用高可用服务公测发布
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 创建一个Struts2项目maven 方式
  • 聚簇索引和非聚簇索引
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 一、python与pycharm的安装
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • (52)只出现一次的数字III
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (ibm)Java 语言的 XPath API
  • (二)springcloud实战之config配置中心
  • (附源码)php投票系统 毕业设计 121500
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • ..回顾17,展望18
  • .NET : 在VS2008中计算代码度量值
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET学习教程二——.net基础定义+VS常用设置
  • .php文件都打不开,打不开php文件怎么办
  • .sdf和.msp文件读取
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [ 转载 ] SharePoint 资料
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]