流
网络程序一大部分的工作是输入和输出,数据字节从一个系统移动到另外一个系统。
1.java的I/O建立在流(stream)基础上的。输入流读取数据而输出流写入数据,不同的流类可以读取特定的数据。所有输入/出流有相同的基本方法来写、读入数据。
2.过滤器(fliter)流可以串链到输入流或输出流上。读写数据的时候过滤器可以修改数据,或者只是提供额外的方法将读入或写入的数据转换为其他格式。
3.阅读器(reader)和书写器(wirter)可以串链到输入流和输出流上,允许程序读或写文本(字符)而不是字节,处理多种不同的字符编码。
4.流是同步的,线程请求一个流读入、写入一段数据的时候。在做任何其他操作前,需要等待所读入、写入的数据。
5.java还支持通过通道和缓冲区的非阻塞I/O。在一些高吞吐量的应用程序里非阻塞I/O速度快。
输出流
java.io.OutputStream是基本输出流类,提供写入数据的基本方法。
流
网络程序一大部分的工作是输入和输出,数据字节从一个系统移动到另外一个系统。
1.java的I/O建立在流(stream)基础上的。输入流读取数据而输出流写入数据,不同的流类可以读取特定的数据。所有输入/出流有相同的基本方法来写、读入数据。
2.过滤器(fliter)流可以串链到输入流或输出流上。读写数据的时候过滤器可以修改数据,或者只是提供额外的方法将读入或写入的数据转换为其他格式。
3.阅读器(reader)和书写器(wirter)可以串链到输入流和输出流上,允许程序读或写文本(字符)而不是字节,处理多种不同的字符编码。
4.流是同步的,线程请求一个流读入、写入一段数据的时候。在做任何其他操作前,需要等待所读入、写入的数据。
5.java还支持通过通道和缓冲区的非阻塞I/O。在一些高吞吐量的应用程序里非阻塞I/O速度快。
输出流
java.io.OutputStream是基本输出流类,提供写入数据的基本方法。
流
网络程序一大部分的工作是输入和输出,数据字节从一个系统移动到另外一个系统。
1.java的I/O建立在流(stream)基础上的。输入流读取数据而输出流写入数据,不同的流类可以读取特定的数据。所有输入/出流有相同的基本方法来写、读入数据。
2.过滤器(fliter)流可以串链到输入流或输出流上。读写数据的时候过滤器可以修改数据,或者只是提供额外的方法将读入或写入的数据转换为其他格式。
3.阅读器(reader)和书写器(wirter)可以串链到输入流和输出流上,允许程序读或写文本(字符)而不是字节,处理多种不同的字符编码。
4.流是同步的,线程请求一个流读入、写入一段数据的时候。在做任何其他操作前,需要等待所读入、写入的数据。
5.java还支持通过通道和缓冲区的非阻塞I/O。在一些高吞吐量的应用程序里非阻塞I/O速度快。
输出流
java.io.OutputStream是基本输出流类,提供写入数据的基本方法。
基本方法write(int b)接受0到255之间的整数作为参数,在对应的字节写入到输入流中,方法声明为抽象方法,因为各个子类需要修改这个方法来处理特定的介质。接受int作为参数,但实际会写入一个无符号的字节(java没有这个数据类型所以需要用int代替)。有都好字节和无符号字节都由8为二进制位构成,区别在于是否有解释。
一次写入一个字节的效率低下而且每个字节单独发送也可能增加主机网络层协议的开销。因此大多数TCP/IP协议都会某种程度上缓存数据,积累一定时间数据之后才会传输。选择write(byte[] data)的方法更好。
基本方法write(int b)接受0到255之间的整数作为参数,在对应的字节写入到输入流中,方法声明为抽象方法,因为各个子类需要修改这个方法来处理特定的介质。接受int作为参数,但实际会写入一个无符号的字节(java没有这个数据类型所以需要用int代替)。有都好字节和无符号字节都由8为二进制位构成,区别在于是否有解释。
一次写入一个字节的效率低下而且每个字节单独发送也可能增加主机网络层协议的开销。因此大多数TCP/IP协议都会某种程度上缓存数据,积累一定时间数据之后才会传输。选择write(byte[] data)的方法更好。
基本方法write(int b)接受0到255之间的整数作为参数,在对应的字节写入到输入流中,方法声明为抽象方法,因为各个子类需要修改这个方法来处理特定的介质。接受int作为参数,但实际会写入一个无符号的字节(java没有这个数据类型所以需要用int代替)。有都好字节和无符号字节都由8为二进制位构成,区别在于是否有解释。
一次写入一个字节的效率低下而且每个字节单独发送也可能增加主机网络层协议的开销。因此大多数TCP/IP协议都会某种程度上缓存数据,积累一定时间数据之后才会传输。选择write(byte[] data)的方法更好。
刷新输出流很重要,取决于如何控制流的缓冲,在close()关闭所有输出流的时候需要刷新输出所有流。
输入流
InputStream类作为父类,具体的之类通过方法从某种介质里读取数据,常见有5种方法。
基本方法没有参数的read()方法是从输入流的源中读取1个字节的数据,作为一个0到255的int返回。流的结束通过返回-1标识。 read()方法会等待阻塞其后任何代码的执行,直到有1字节的数据可供读取。
read()返回的是int类型,因此在把结果进行存储到字节数组之前就需要进行数据类型转化。
byte[] input = new byte[10];
for(int i =0;i<input.length;i++){
int b = in.read();
if(b==-1) break;
input[i] = (byte) b;
}
available()方法来确定不阻塞的情况下有多少字节可以读取,返回读取的最少字节数。
int bytesavaliable = in.avaliable();
byte[] input = ew byte[bytesavaliable];
int bytesread= in.read[input,0,bytesavaliable];
mark()方法标记流的当前位置,在以后某个时刻用reset()方法把流重置到之前标记的位置。接下来读取的操作会返回从标记位置开始的数据。
过滤器流
过滤器流以及阅读器和书写器。过滤器仍然主要将原始数据作为字节处理。阅读器和书写器处理多种编码文本的特殊情况,如UTP-8和ISO8859-1。过滤器以链的形式进行组织,链的每个环节都接收前一个过滤器或流的数据,并把数据传递给链中的下一个环节。比如如下的过程:
缓冲流
BufferedInputStream及其构造函数
BufferedOutStream类将写入的数据存储在缓冲区中(一个名为buf的保护字节数组字段),直到缓冲区满或刷新输出流。然后它将数据一次全部写入底层输出流。如果一次写入多字节,这和多次写入少量字节相比,前者往往更快。
BufferedInputStream类也有一个作为缓冲区的保护字节数据,它首先尝试从缓冲区获得请求的数据。自由当缓冲区没有数据时,流才从底层的源中读取数据。这是,它会从源中读取尽可能多的数据存入缓冲区,而不管是否马上需要所有这些数据。不会立即用到的数据可以在以后调用read()是读取。
覆盖InputStream方法。第一参数是底层流,可以从中读取为缓冲的数据,或者向其写入缓冲的数据,第二个参数制定缓冲区里的字节数,否则,输如流缓冲区大小设置为2048字节、输出流的缓冲区大小设置为512字节。缓冲区的理想大小取决于说缓冲的流是何种类型。
PrintStream()类
printstream类似一个过滤器输出流,System.out就是一个PritnStream。除了常见的write()、flush()、close()方法使用,它有几个问题要使得其不适合网络编程里的输出。
no1:println()的输出和平台有关,取决于运行代码的机器,各行有时候用分隔符有时候用回车等分隔。
no2:printstream类假定使用所在平台的默认编码方式,但可能这种编码方式不是服务器或者客户端需要的。
no3:printstream吞掉所有异常,因此不适合经常需要处理异常的网络编程。
数据流
DataInputStream和DataOutputStram类提供一些方法,可以用二进制的格式读或写java的基本数据类型和字符串,所用的二进制格式主要用于两个不同的java程序之间交换数据(可能通过网络链接、数据文件、管道或者其他中间)。输出流写入什么数据,输入流能读取什么数据,不过碰巧和大多数交换二进制的internet协议所用的格式相同。
书写器和过滤器
reader和writer两个抽象超类定义读和写字符的基本API,java.io.Reader制定读取字符API;java.io.Writer制定写字符的API.
InputStreamReader和OutputStreamWriter两个类似其具体的子类,分别包含着底层输入流和底层输出流。
不需要底层输入流可以读取字符的类
Writer类似java.io.OutputStream类的影射,是一个抽象类,有两个保护类型的构造函数。Writer类不字节使用,而是要通过它的某个子类以多态的方式使用。