流与缓冲
Posted L的存在
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了流与缓冲相关的知识,希望对你有一定的参考价值。
1 目的:
为了使程序的运行效率最高,流对象通常提供缓冲区来减少调用系统I/O库函数的次数。
2 三大缓冲:
全缓冲:缓冲区满才调用系统I/O函数。对于读操作,知道读取的字节数等于了缓冲区大小或者说到了文件的末尾,才进行实际的I/O操作。
行缓冲:直到遇到了\'\\n\'才调用I/O库函数。注意,因为缓冲区大小是有限制的,所以一旦缓冲满了也没有遇到\\n,仍然会进行实际的I/O操作。标准输入stdin和stdout默认为行缓冲
无缓冲:数据立即读入或者输出到外存文件或者设备。stderr是无缓冲的,这样可以实时的保证错误的提示并反馈给客户。
3 三个缓冲分别定义了三个宏:使用方法:缓冲标志和宏做与操作 如果结果为1那么就可直到该缓冲文件流的缓冲区是否是属于该类型了。
4 例子:得到文件流的缓冲区类型。输出标准输出 标准输入和标准出错三个文件描述符的缓冲区类型 大小等信息
1 #include <stdio.h> 2 int main(void) 3 { 4 printf("stdin is "); 5 if(stdin->_flags & _IO_UNBUFFERED) /* 判断标准输入流对象的缓冲区类型*/ 6 printf("unbuffered\\n"); 7 else if(stdin->_flags & _IO_LINE_BUF) 8 printf("line-buffered\\n"); 9 else 10 printf("fully-buffered\\n"); 11 printf("buffer size is %d\\n", stdin->_IO_buf_end - stdin->_IO_buf_base); /* 输出缓冲区的大小 */ 12 printf("discriptor is %d\\n\\n", fileno(stdin)); /* 输出文件描述符 */ 13 printf("stdout is "); 14 if(stdout->_flags & _IO_UNBUFFERED) /* 判断标准输出流对象的缓冲区类型*/ 15 printf("unbuffered\\n"); 16 else if(stdout->_flags & _IO_LINE_BUF) 17 printf("line-buffered\\n"); 18 else 19 printf("fully-buffered\\n"); 20 printf("buffer size is %d\\n", stdout->_IO_buf_end - stdout->_IO_buf_base); /* 输出缓冲区的大小 */ 21 printf("discriptor is %d\\n\\n", fileno(stdout)); /* 输出文件描述符 */ 22 printf("stderr is "); 23 if(stderr->_flags & _IO_UNBUFFERED) /* 判断标准出错流对象的缓冲区类型*/ 24 printf("unbuffered\\n"); 25 else if(stderr->_flags & _IO_LINE_BUF) 26 printf("line-buffered\\n"); 27 else 28 printf("fully-buffered\\n"); 29 printf("buffer size is %d\\n", stderr->_IO_buf_end - stderr->_IO_buf_base); /* 输出缓冲区的大小 */ 30 printf("discriptor is %d\\n\\n", fileno(stderr)); /* 输出文件描述符 */ 31 return 0; 32 }
5 截图
以上是关于流与缓冲的主要内容,如果未能解决你的问题,请参考以下文章
字符缓冲流,properties类,序列化流与反序列化流,打印流
Java学习笔记6.2.1 字符流 - 文件字符流与缓冲字符流