java网络---流
网络操作很大一部分功能就是输入和输出数据。
简单归纳就是上传和下载文件。文件也是数据的一种载体。
java对数据的操作归并为流。
所以对于数据流的操作定义2个基本类。
java.io.OutputStream
java.io.InputStream
一:OutputStream & InputStream
输出流。也就是写入数据,在这里有个易被忽视的方法:flush。
public void flush() throws IOException {
}
这个方法的作用,我们每次写一个字符到文件或者其他地方是十分冗余的,如果可以,那就有一个缓存,当我数据达到一定量的时候,
才开始写入的操作。
所以调用:
public void write(byte b[], int off, int len) throws IOException
不一定会立刻把数据写入到文件中,这个时候如果close,这部分数据就会丢失掉。
而flush的作用就是,在缓存区,不管数据是否达到一个临界值,强制把数据写入到文件中!
输入流,与输出流相对的。
也有很多方法。最重要的当然是read。
读取单个字符的方式,显然不是很好的一个方式。
@Override public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException {
return IoBridge.read(fd, buffer, byteOffset, byteCount);
}
以上就是android里面java/io/FileInputStream.java 读取多个字符的方法。
由于网络会比较忙,所以通常传输1024字节的内容,可能只收到512个,剩余部分还在传输过程中。
二:缓冲流
BufferedInputStream和BufferedOutputStream
他们会对inputStream & OutputStream做缓存,然后提高传输的性能。
对于网络传输来说,一次传递1个字节,但是它要包40个字节的头,所以1K的数据会变成41K,
而如果打包在一次,则只要1K多点的数据就可以,性能显然会差很多。
@Override
public synchronized int read() throws IOException {
// Use local refs since buf and in may be invalidated by an
// unsynchronized close()
byte[] localBuf = buf;
InputStream localIn = in;
if (localBuf == null || localIn == null) {
throw streamClosed();
} /* Are there buffered bytes available? */
if (pos >= count && fillbuf(localIn, localBuf) == -1) {
return -1; /* no, fill buffer */
}
// localBuf may have been invalidated by fillbuf
if (localBuf != buf) {
localBuf = buf;
if (localBuf == null) {
throw streamClosed();
}
} /* Did filling the buffer fail with -1 (EOF)? */
if (count - pos > 0) {
return localBuf[pos++] & 0xFF;
}
return -1;
}
关键就是fillbuf这个操作,所以read方法每次读取的都是一段字节,而不是依次读取的。
private int fillbuf(InputStream localIn, byte[] localBuf)
throws IOException {
if (markpos == -1 || (pos - markpos >= marklimit)) {
/* Mark position not set or exceeded readlimit */
int result = localIn.read(localBuf);
if (result > 0) {
markpos = -1;
pos = 0;
count = result == -1 ? 0 : result;
}
return result;
}
if (markpos == 0 && marklimit > localBuf.length) {
/* Increase buffer size to accommodate the readlimit */
int newLength = localBuf.length * 2;
if (newLength > marklimit) {
newLength = marklimit;
}
byte[] newbuf = new byte[newLength];
System.arraycopy(localBuf, 0, newbuf, 0, localBuf.length);
// Reassign buf, which will invalidate any local references
// FIXME: what if buf was null?
localBuf = buf = newbuf;
} else if (markpos > 0) {
System.arraycopy(localBuf, markpos, localBuf, 0, localBuf.length
- markpos);
}
/* Set the new position and mark position */
pos -= markpos;
count = markpos = 0;
int bytesread = localIn.read(localBuf, pos, localBuf.length - pos);
count = bytesread <= 0 ? pos : pos + bytesread;
return bytesread;
}
可以看到fillbuf里面会调用
int bytesread = localIn.read(localBuf, pos, localBuf.length - pos);
所以buffer 会把stream放入到一个byte[]的数组里面。
三:压缩流:
DeflaterOutputStream
InflaterInputStream
GZIPOutputStream
GZIPInputStream
ZipOutputStream
ZipInputStream
这六个就是java提供的压缩流,他们的读写就是使用read & write方法。
输出流压缩数据,输入流解压数据。
四:摘要流
DigestInputStream,DigestOutputStream
摘要流的目的,主要是可以验证数据的完整性。
虽然程序员可以更高效的写出独立的验证算法,但是统一使用以后,可以简化这部分的操作。
五:阅读器和书写器
Reader -> BufferedReader -> LineNumberReader
-> InputStreamReader -> FileReader Writer -> BufferedWriter
-> OutputStreamWriter -> FileWriter
网络传输中有各种不同的字符编码,所以就会需要有一个读写和处理的工具来操作流。
FileReader & FileWrite是处理文件的,具体的细节就不写了!
java网络---流的更多相关文章
- Java网络多线程编程:对象流错误导致Connection reset
Java网络多线程编程--对象流错误导致Connection reset 在老韩的网络多线程编程实战项目中,发生了如下报错: 服务器端和客户端均发生了报错,在确定相应对象流代码完全没有问题之后,回归定 ...
- Java:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...
- 揭开Java IO流中的flush()的神秘面纱
大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...
- Java 网络编程学习总结
新手一枚,Java学习中,把自己学习网络编程的知识总结一下,梳理下知识,方便日后查阅,高手莫进. 本文的主要内容: [1] 网络编程认识 [2] TCP/IP编程 ...
- 20145212 实验五《Java网络编程》
20145212 实验五<Java网络编程> 一.实验内容 1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成 ...
- Java IO流题库
一. 填空题 Java IO流可以分为 节点流 和处理流两大类,其中前者处于IO操作的第一线,所有操作必须通过他们进行. 输入流的唯一目的是提供通往数据的通道,程序可以通过这个通道读取数 ...
- 20145337实验五Java网络编程及安全
20145337实验五Java网络编程及安全 实验内容 掌握Socket程序的编写 掌握密码技术的使用 设计安全传输系统 实验步骤 基于Java Socket实现安全传输 基于TCP实现客户端和服务器 ...
- java 网络编程复习(转)
好久没有看过Java网络编程了,现在刚好公司有机会接触,顺便的拾起以前的东西 参照原博客:http://www.cnblogs.com/linzheng/archive/2011/01/23/1942 ...
- Java 网络编程----基本概念
网络现在是一个非常普遍的概念. 以下是维基百科上的解释: 网络一词有多种意义,可解作: 网络流也简称为网络(network).一般用于管道系统.交通系统.通讯系统建模. 有时特指计算机网络. 或特指其 ...
随机推荐
- 企业云部署要如何选择IaaS PaaS和SaaS
1为什么IaaS成了灵丹妙药 我非常惊讶,为什么很多传统企业已经接受了云计算,但接受的方式却往往不尽人意.对大多数企业来说,云计算的投入产出比相对较小,并且局限于基础设施层的环节. 就目前而言,大 ...
- 前端优化:RequireJS Optimizer 的使用和配置方法
RequireJS Optimizer 是 RequireJS 自带的前端优化工具,可以对 RequireJS 项目中的 JavaScript & CSS 代码使用 UglifyJS 或者 C ...
- 如何根据iframe内嵌页面调整iframe高宽续篇
接着昨天的工作 如何根据iframe内嵌页面调整iframe高宽 来说,按照文章中说的第二种方法实现代码如下: 实现 A.com/detail/view 页面的iframe代码如下: <ifra ...
- BZOJ1008 /乘法原理+快速幂 解题报告
1008: [HNOI2008]越狱 Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生 ...
- python反转字符串(简单方法)及简单的文件操作示例
Python反转字符串的最简单方法是用切片: >>> a=' >>> print a[::-1] 654321 切片介绍:切片操作符中的第一个数(冒号之前)表示切片 ...
- ADO.NET 基础
*程序要和数据库交互要通过ADO.NET进行,通过ADO.NET就能在程序中执行SQL了,ADO.NET中提供了对各种不同数据库的统一操作接口. 1.连接SQLServer 连接字符串,程序通过链接字 ...
- 数论 - n元线性同余方程的解法
note:n元线性同余方程因其编程的特殊性,一般在acm中用的很少,这里只是出于兴趣学了一下 n元线性同余方程的概念: 形如:(a1*x1+a2*x2+....+an*xn)%m=b%m ...
- 控制网页的Panel是否显示
在网页上有十二个Panel控件,默认状态是不显示的,根据当前月作为条件去控制对应的Panel控件显示. Insus.NET以下使用三种方法来实现它,先是第一种,使用FindControl方法 第二种方 ...
- [CLR via C#]11. 事件
一. 设计要公开事件的类型 如果类型定义了事件成员,那么类型(或类型实例)就可以通知其他对象发生了一些特定的事情. 例如,Button类提供了一个名为Click的事件.应用程序中的一个或多个对象可能想 ...
- Discuz API的延伸
作为社交平台来使用Discuz的话,UC_Server提供的那些数据接口是不够用的,我们还需要访问及操作用户的扩展数据. 基于UXF框架的rest_controller,很容易就可以实现API接口. ...