Java流(stream)复习

本文详细介绍了Java的流(Stream)概念,重点讨论了输出流的使用,包括基本的OutputStream类及其子类如FileOutputStream,以及字符生成器协议。同时,提到了缓冲、释放模式和flush()方法的重要性。接着,转向输入流,探讨了标记和重置功能。此外,还涵盖了过滤器流的使用,特别是缓冲流和数据流。最后,文章讲解了Reader和Writer类在处理字符输入输出时的角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输出流

Java的基本输出流类是Java.io.OutputStream;
这个类提供了写入数据的基本方法:
在这里插入图片描述
它的子类
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字节通常效率不高,我们可以试着多字节一次性发送:

在这里插入图片描述

使用缓冲的注意事项

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

释放模式

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

在这里插入图片描述
新的释放模式允许在try块中声明变量:
在这里插入图片描述
并且不再需要finally子句,因为Java7会对try块参数表中声明的所有AutoCloseable对象自动调用close().

输入流

Java的基本输入类是Java.io.InputStream.
在这里插入图片描述
read()的标准用法:
在这里插入图片描述
在这里插入图片描述

标记和重置

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

过滤器流

Java提供了很多过滤器类,可以附加到原始流中,在原始字节和各种格式之间来回转换.
过滤器以链的形式进行组织.
在这里插入图片描述
链中的每个环节都接收前一个过滤器或流的数据,并把数据传递给链中的下一个环节.
在这里插入图片描述

将过滤器串联在一起

在这里插入图片描述在这里插入图片描述

缓冲流

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

过滤器输出流

在这里插入图片描述
如果使用println()方法,在UNIX下是换行符(\n),在MAC OS9下是回车符(\r),在windows下是(\r\n).这会带来什么问题?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

数据流

在这里插入图片描述在这里插入图片描述
所有数据都以big-endian格式写入.整数用尽可能少的字节书写为2的补码.因此,byte会写为1字节,short写为2字节,int写为4字节,long写为8字节,浮点数(flaot)写为4字节的IEEE 754格式,双精度数(double)写为8字节的IEEE 754格式,boolean写为1字节,char写为2个无符号字节.
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

阅读器和书写器

java.io.Reader类指定读取字符的API.
java.io.Writer指定写字符的API.
对应输入和输出流使用字节的地方,阅读器和书写器会使用Unicode字符.
在这里插入图片描述在这里插入图片描述

书写器(Writer)

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

OutputStreamWriter

在这里插入图片描述

阅读器(Reader)

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

PrintWriter

在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值