我们知道,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;
}
}
分享到:
相关推荐
作为抽象类,`InputStream`定义了一系列基本的方法来读取字节数据,这些方法由其子类进行具体实现。`InputStream`的出现是为了提供一个统一的接口,方便开发者处理各种不同类型的输入数据流。 **1. 抽象类与继承...
然后,我们创建了一个`CachedServletInputStream`类,它实现了`ServletInputStream`接口,并从缓存的字节数组中读取数据。 在处理请求时,我们可以先创建一个`RepeatableHttpServletRequest`实例,将其传递给我们的...
InputStream有多种实现类,如FileInputStream、PipedInputStream、FilterInputStream等,每种实现类都有其特定的读取方式。 OutputStream是所有输出流的抽象超类,它提供了基本的写入方法,如write()、write(int b)...
标签 "源码" 暗示这篇博客可能深入剖析了 `InputStream` 类的源代码,分析了其实现细节和设计思路。这可能包括类的构造函数、方法的实现逻辑以及与其他类的协作关系。 "工具" 标签可能意味着博客作者讨论了如何利用...
在Java编程语言中,`InputStream`和`OutputStream`是处理数据流的核心类,它们属于Java的I/O(Input/Output)框架。`File`类则用于处理文件操作,如读写、创建、删除等。理解如何在这些对象之间进行转换是Java开发中...
`Blob`类提供了`getBinaryStream()`方法,可以直接返回一个`InputStream`对象,用于读取`Blob`中的数据。 #### 总结 本文介绍了`Blob`、`InputStream`、`byte[]`之间的相互转换方法,并给出了详细的代码示例。...
首先,我们需要理解`OutputStream`和`InputStream`这两个核心的I/O类。`OutputStream`是用于写出数据到目的地的流,而`InputStream`则是用于读取数据的流。在Java中,它们是Java.io包下的基础类,提供了多种子类来...
在 Java 中,InputStream 是一个抽象类,用于读取字节流。它是 Java IO 体系中最基本的输入流接口。InputStream 的主要方法有: * `read()`:读取一个字节 * `read(byte[] b)`:读取多个字节到字节数组中 * `close...
本主题主要关注使用`InputStream`类来解析CSV文件,尤其适合处理大型文件,如含有超过10万行的CSV。 在Java中,`InputStream`是所有字节输入流的基础类,用于读取连续的字节序列。在处理大型CSV文件时,直接使用`...
在实现这些转换时,为了提高代码的复用性和效率,可以使用单例模式来创建一个工具类,如提供的`FormatTools.java`。单例模式确保了类只有一个实例,减少了资源消耗,同时提供了一个全局访问点,方便在应用中调用这些...
标签中的"源码"提示我们可能需要深入理解`ServletOutputStream` 和`InputStream` 的内部实现,包括它们如何与网络I/O交互,以及如何处理缓冲区和数据编码等问题。而"工具"可能指的是使用这些流类来构建各种服务器端...
在这里,我们使用了MyX509TrustManager来验证SSL证书,该类继承自X509TrustManager,并覆盖了checkClientTrusted和checkServerTrusted方法来实现自定义的SSL验证。 本篇文章介绍了如何使用Java语言实现Http和...
本教程将聚焦于Java的基础核心,以及两个重要的I/O(输入/输出)流类——InputStream和OutputStream,它们在文件操作中扮演着关键角色。 InputStream和OutputStream是Java.io包下的抽象类,是所有字节流的基类。...
在Java程序中,可以使用javax.comm开发包中的类实现微机的RS-232串口与ZigBee模块的全双工通讯。javax.comm开发包提供了对RS-232串行端口通讯的支持,Java通过该类库能够极大地简化对串口的操作过程。 在实现ZigBee...
Java InputStream 的多种使用详解 ...InputStream 是 Java 中用于读取数据流的抽象类,它的子类有多种,每种子类都有其特殊的用途和实现方式。通过选择合适的子类,可以提高读取数据的效率和性能。
InputStream类用于读取数据,而OutputStream类用于写入数据。在网络编程中,我们经常使用InputStream和OutputStream来读取和写入网络数据。 PrintWriter类 PrintWriter类是Java语言中用于打印输出的类。它提供了...
本篇文章将深入探讨网络类加载器的实现,这是一个允许从网络中动态加载类的特殊类加载器。 网络类加载器的主要作用是在程序运行时,根据需要从远程服务器上获取类的字节码文件,并将其转换为Java类。这种功能对于...
JAVA基于SnakeYAML实现解析与序列化YAML JAVA基于SnakeYAML实现解析与序列化YAML是JAVA开发中的一种常见需求,本文主要介绍了如何使用SnakeYAML库将YAML文档转换为Java对象,以及Java对象如何序列化为YAML文档。...
在文件上传过程中,我们使用了 InputStream 类来读取上传的文件,并将其写入到 FileOutputStream 中。同时,我们也使用了 RandomAccessFile 类来读取临时文件名,并将其写入到服务器中。 在文件上传过程中,我们还...
这里导入了处理输入输出流的`InputStream`和`PrintStream`类,以及`TelnetClient`类,这是Apache Commons Net提供的用于实现Telnet协议的类。 ##### 2. 定义`CommonsTelnetTest`类 ```java public class ...