流
- java独特的I/O方法
- java的I/O是建立在流上面的
- 输出流写入数据,输入流读取数据,即输出流将数据写入缓冲区,输入流将数据从缓冲区里面读出来
- 所有的输出流写入数据的方法相同,所有的输入流读取数据的方法相同
- 流是同步的即流是阻塞的,它会在读取数据之后进行其他操作
- 使用write(byte[])或write(byte[],int off,int length)通常比一次发送一个字节要快得多
- flush刷新:flush方法可以强迫窝在缓冲区里的数据的流发送数据,即便此时缓冲区还没有满
- 在关闭流之前应刷新流。否则,流在关闭时,在缓冲区里的数据可能丢失
- IOException异常,close方法会将与这个流关联的所有资源都释放,进一步的写入就会抛出异常
- 缓冲区与内存的区别,缓冲区在内存上开辟
- 原始流:InputStream和OutputStream是原始流,仅仅能够单个或成组的读写字节而已
- 过滤器流:附加到原始流,在字节和各种格式之间来回转换
-
从底层流读取几百个字节的速度与读取一个字节相当
socket基础
socket的七项操作
- 连接远程主机
- 发送数据
- 接收数据
- 关闭连接
- 绑定端口
- 监听入站数据
-
在所有绑定端口上接收来自远程机器的连接
socket的本质
socket为内核对象,由操作系统内核来维护其缓冲区,引用计数,并且可以在多个线程中使用
当我们使用socket函数以后,如果成功的话会返回一个int型的描述符,它指向前面那个被维护在内核里的socket数据结构。我们的任何操作都是通过这个描述符而作用到那个数据结构上的。这就像是我们在建立一个文件后得到一个文件描述符一样,对文件的操作都是通过文件描述符来进行的,而不是直接作用到inode数据结构上
当建立了这个套接字以后,我们可以获得一个象文件描述符那样的套接字描述 符。就象我们对文件进行操作那样,我们可以通过向套接字里面写数据将数据传送到我们指定的地方,这个地方可以是远端的主机,也可以是本地的主机
建立socket连接,对于准备建立一个连接,服务器端要两个步骤:bind, listen;客户端一个步骤:connct。如果服务器端accept一个connect,而客户端得到了这个accept的确认,那么一个连接就建立了。