Java流(stream)复习

文章目录

    • 输出流
      • 通过字符生成器协议理解输出流
      • 使用缓冲的注意事项
      • 释放模式
    • 输入流
      • 标记和重置
    • 过滤器流
      • 将过滤器串联在一起
      • 缓冲流
      • 过滤器输出流
      • 数据流
    • 阅读器和书写器
      • 书写器(Writer)
        • OutputStreamWriter
      • 阅读器(Reader)
    • 关于过滤器、阅读器和书写器
      • PrintWriter

输出流

Java的基本输出流类是Java.io.OutputStream;
这个类提供了写入数据的基本方法:
Java流(stream)复习_第1张图片
它的子类
FileOutputStream使用这些方法将数据写入文件.
TelnetOutputStream使用这些方法将数据写入网络连接.
ByteArrayOutputStream使用这些方法将数据写入可扩展的字节数组.

在原生的write(int b)方法中int只接受0到255之间的整数.,若大于255,将该数转为二进制,取低八位.

通过字符生成器协议理解输出流

字符生成器协议定义了一个发出ASCII文本的服务器.这个最流行的变体是发送72个字符的文本行,其中包含可显示的ASCII字符.
可显示的ASCII字符是33到126之间的字符.
由于ASCII是7位字符集,因此1个字节就能正确显示一个ASCII字符.

public static void generateCharacters(OutputStream out) throws IOException{
     
	int firstPrintableCharacter=33;
	int numberOfPrintableCharacters=94;
	int numberOfCharactersPerLine=72;
	int start=firstPrintableCharacter;
	while(true){
     
	for(int i=start;i<start+numberOfCharactersPerLine;i++){
     
	out.write(((i-firstPrintableCharacter)%numberOfPrintableCharacters)+firstPrintableCharacter)
}
out.write('\r');
out.write('\n');
start=((start+1)-firstPrintableCharacter)%numberOfPrintableCharacters+firstPrintableCharacter;
}
}

一次写入1字节通常效率不高,我们可以试着多字节一次性发送:

Java流(stream)复习_第2张图片

使用缓冲的注意事项

在写入数据完成后,刷新(flush)输出流非常重要.例如,假设已经向使用HTTP1.1服务器写入300字节的请求,通常你会等待响应,然后再发送更多的数据.
如果输出流有一个1024字节的缓冲区,那这个流在发送缓冲区中的数据之前会等待更多的数据到达.
在服务器响应到达之前不会向流写入数据,由于请求还没发送,响应永远不会到来.
而flush()方法可以强迫缓冲的流发送数据,即使缓冲区还没满.
Java流(stream)复习_第3张图片
由于system.out会缓冲数据,最好用flush()将数据从缓冲区中取出.
在关闭流之前也应该立即刷新输出所有流避免缓冲区的数据丢失.

释放模式

早期的释放模式要求在finally块中关闭流.在try块之外声明流变量,在try块之内完成初始化.为了避免nullpointerException异常,在关闭流之前检查流变量是否为null:

Java流(stream)复习_第4张图片
新的释放模式允许在try块中声明变量:
Java流(stream)复习_第5张图片
并且不再需要finally子句,因为Java7会对try块参数表中声明的所有AutoCloseable对象自动调用close().

输入流

Java的基本输入类是Java.io.InputStream.
Java流(stream)复习_第6张图片
read()的标准用法:
Java流(stream)复习_第7张图片
Java流(stream)复习_第8张图片

标记和重置

inputstream类还有三个不太常用的方法,允许程序备份和重新读取已经读取的数据.
在这里插入图片描述
为了重新读取数据,要用mark()方法标记流的当前位置.在以后某个时刻,可以用reset()方法把流重置到之前标记的位置.接下来的读取操作会返回从标记位置开始的数据.
注意:回溯的时候能回溯的字节数是由mark()的readAheadLimit参数确定的.
一个流在任何时候都只能有一个标记.
Java流(stream)复习_第9张图片
支持标记的输入流是BufferedInputStreamByteArrayInputStream.

过滤器流

Java提供了很多过滤器类,可以附加到原始流中,在原始字节和各种格式之间来回转换.
过滤器以链的形式进行组织.
Java流(stream)复习_第10张图片
链中的每个环节都接收前一个过滤器或流的数据,并把数据传递给链中的下一个环节.
Java流(stream)复习_第11张图片

将过滤器串联在一起

Java流(stream)复习_第12张图片在这里插入图片描述

缓冲流

Java流(stream)复习_第13张图片Java流(stream)复习_第14张图片Java流(stream)复习_第15张图片Java流(stream)复习_第16张图片Java流(stream)复习_第17张图片

过滤器输出流

Java流(stream)复习_第18张图片
如果使用println()方法,在UNIX下是换行符(\n),在MAC OS9下是回车符(\r),在windows下是(\r\n).这会带来什么问题?
Java流(stream)复习_第19张图片
Java流(stream)复习_第20张图片
Java流(stream)复习_第21张图片Java流(stream)复习_第22张图片

数据流

Java流(stream)复习_第23张图片Java流(stream)复习_第24张图片
所有数据都以big-endian格式写入.整数用尽可能少的字节书写为2的补码.因此,byte会写为1字节,short写为2字节,int写为4字节,long写为8字节,浮点数(flaot)写为4字节的IEEE 754格式,双精度数(double)写为8字节的IEEE 754格式,boolean写为1字节,char写为2个无符号字节.
Java流(stream)复习_第25张图片Java流(stream)复习_第26张图片Java流(stream)复习_第27张图片Java流(stream)复习_第28张图片Java流(stream)复习_第29张图片Java流(stream)复习_第30张图片

阅读器和书写器

java.io.Reader类指定读取字符的API.
java.io.Writer指定写字符的API.
对应输入和输出流使用字节的地方,阅读器和书写器会使用Unicode字符.
Java流(stream)复习_第31张图片Java流(stream)复习_第32张图片

书写器(Writer)

在这里插入图片描述Java流(stream)复习_第33张图片Java流(stream)复习_第34张图片Java流(stream)复习_第35张图片

OutputStreamWriter

Java流(stream)复习_第36张图片

阅读器(Reader)

Java流(stream)复习_第37张图片Java流(stream)复习_第38张图片Java流(stream)复习_第39张图片Java流(stream)复习_第40张图片Java流(stream)复习_第41张图片Java流(stream)复习_第42张图片

关于过滤器、阅读器和书写器

Java流(stream)复习_第43张图片Java流(stream)复习_第44张图片
Java流(stream)复习_第45张图片Java流(stream)复习_第46张图片Java流(stream)复习_第47张图片Java流(stream)复习_第48张图片

PrintWriter

Java流(stream)复习_第49张图片Java流(stream)复习_第50张图片

你可能感兴趣的:(网络编程)