标准I/O提供了三种类型的缓存:
(1) 全缓存。在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。对于驻在磁盘上的文件通常是由标准I/O库实施全缓存的。在一个流上执行第一次I/O操作时,相关标准I/O函数通常调用malloc(见7 . 8节)获得需使用的缓存。
术语刷新(flush)说明标准I/O缓存的写操作。缓存可由标准I/O例程自动地刷新(例如当填满一个缓存时),或者可以调用函数fflush刷新一个流。值得引起注意的是在UNIX环境中,刷新有两种意思。在标准I/O库方面,刷新意味着将缓存中的内容写到磁盘上(该缓存可以只是局部填写的)。在终端驱动程序方面(例如在第11章中所述的tcflush函数),刷新表示丢弃已存在缓存中的数据。
(2) 行缓存。在这种情况下,当在输入和输出中遇到新行符时,标准I/O库执行I/O操作。这允许我们一次输出一个字符(用标准 I/O fputc函数),但只有在写了一行之后才进行实际I/O操作。当流涉及一个终端时(例如标准输入和标准输出),典型地使用行缓存。对于行缓存有两个限制。第一个是:因为标准I/O库用来收集每一行的缓存的长度是固定的,所以只要填满了缓存,那么即使还没有写一个新行符,也进行I/O 操作。第二个是:任何时候只要通过标准输入输出库要求从(a)一个不带缓存的流,或者(b)一个行缓存的流(它预先要求从内核得到数据)得到输入数据,那么就会造成刷新所有行缓存输出流。在(b)中带了一个在括号中的说明的理由是,所需的数据可能已在该缓存中,它并不要求内核在需要该数据时才进行该操作。很明显,从不带缓存的一个流中进行输入((a)项)要求当时从内核得到数据。
(3) 不带缓存。标准I/O库不对字符进行缓存。如果用标准I/O函数写若干字符到不带缓存的流中,则相当于用write系统调用函数将这些字符写至相关联的打开文件上。标准出错流stderr通常是不带缓存的,这就使得出错信息可以尽快显示出来,而不管它们是否含有一个新行字符。
ANSIC要求下列缓存特征:
(1) 当且仅当标准输入和标准输出并不涉及交互作用设备时,它们才是全缓存的。
(2) 标准出错决不会是全缓存的。
但是,这并没有告诉我们如果标准输入和输出涉及交互作用设备时,它们是不带缓存的还是行缓存的,以及标准输出是不带缓存的,还是行缓存的。SVR 4和4.3+ BSD的系统默认使用下列类型的缓存:
标准出错是不带缓存的。
如若是涉及终端设备的其他流,则它们是行缓存的;否则是全缓存的。
我们经常要用到标准输入和输出,而ANSI C对stdin、stdout和stderr的缓存特征没有强行的规定,以至于不同的系统可能有不同的stdin、stdout和stderr的缓存特征。目前主要的缓存特征是:stdin和stdout是行缓存;而stderr是无缓存的。
参考:
1. 《UNIX环境高级编程》第五章,Stevens
2.
关于流和缓冲区的理解以及一般标准输入问题的解决方法小结(很详细)
分享到:
相关推荐
在Java中,IO流分为两大类:字节流和字符流,每种流又有输入流和输出流之分,分别用于数据的读取和写入。 1. **字节流**: - 字节流处理的是8位的字节数据,是最基本的流类型。Java中的`InputStream`和`...
在Java中,IO流被设计用来在不同的数据源和目的地之间传输数据,如文件、网络连接、内存缓冲区等。本教程将详细介绍Java IO中的字节流、字符流、缓冲流以及转换流,并通过IODemo实例来展示它们的用法。 ### 1. 字节...
缓冲流分为字节缓冲流和字符缓冲流两种,分别是BufferedInputStream、BufferedOutputStream和BufferedReader、BufferedWriter。 字节缓冲流的构造方法有两个,一个是public BufferedInputStream(InputStream in),...
缓冲流分为字节缓冲流和字符缓冲流两大类,分别是`BufferedInputStream`和`BufferedOutputStream`(处理字节流)以及`BufferedReader`和`BufferedWriter`(处理字符流)。缓冲流的主要作用在于减少对系统I/O操作的...
【缓冲流、转换流、序列化流、打印流】-笔记`文件可能包含了详细的解释和示例代码,通过阅读这份笔记,可以更深入地理解这些流的用法和优化技巧。 总之,理解并熟练运用Java的缓冲流、转换流、序列化流和打印流,...
字节缓冲流的构造方法为public BufferedInputStream(InputStream in)和public BufferedOutputStream(OutputStream out),用于创建新的缓冲输入流和缓冲输出流。缓冲流的读写方法与基本的流是一致的,我们可以通过...
本讲义主要探讨的是Java IO中的转换流和缓冲流,这两个概念对于高效且灵活的数据操作至关重要。 转换流(InputStreamReader和OutputStreamWriter)在Java IO系统中起到桥梁的作用,它们允许我们进行字符流与字节流...
java IO流 1. 流的概念 2. 输入流和输出流 3. 字符流、字节流 4. 缓冲流 5. 转换流处理流
除了基本的字节和字符缓冲流外,还有对应的打印流(PrintStream 和 PrintWriter),以及可以对其他流进行缓冲化的装饰器模式实现,例如 FilterInputStream 和 FilterOutputStream。转换流(如InputStreamReader 和 ...
在Java编程中,缓冲流(Buffered Stream)和转换流(Transferring Stream)是用于提高I/O操作效率的重要工具。这两个概念在处理文件读写、数据传输等场景时非常常见。下面,我们将深入理解这些知识点,并根据提供的...
Java提供了四个缓冲流类:`BufferedInputStream`、`BufferedOutputStream`、`BufferedReader`和`BufferedWriter`。这些类分别增强了字节输入流、字节输出流、字符输入流和字符输出流。使用缓冲流可以显著提高读写...
File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型字节流、打印流、对象序列化流、字节数组流)、字符流(缓冲字符流、文件字符流、转换流、格式化输出流、字符数组流) 这份代码源码...
字节缓冲流可以分为字节缓冲输出流和字节缓冲输入流两种。字节缓冲输出流可以将数据写入到文件中,而字节缓冲输入流可以从文件中读取数据。在本节中,我们将详细介绍字节缓冲流的构造方法、应用场景以及示例代码。 ...
Java文件流知识点梳理总结,IO文件流,包含了File类、缓冲流、字节流、字符流、转换流等
点和线多边形缓冲区是GIS(地理信息系统)中常用的一种技术,它涉及到空间分析和几何处理。在C#编程环境下,我们可以利用.NET Framework提供的Geometry类库来实现这一功能,尤其是在开发基于Web的地图应用时,如使用...
Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元...字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。
在处理音频流时,为了提高效率和防止数据丢失,通常会使用缓冲区来暂时存储数据。在安卓录音中,我们可以设定缓冲区大小,`AudioRecord`会在缓冲区满时触发读取事件,将新录制的音频数据读入。这允许开发者在合适的...
在电子设计领域,芯片I/O缓冲及ESD电路设计是至关重要的环节,它们关系到芯片与外界环境的交互效率和稳定性。I/O缓冲电路作为芯片与外部系统通信的桥梁,承担着信号转换、驱动和保护的重要任务。这篇文章将深入探讨I...
在实际应用中,可能还需要考虑其他因素,比如错误处理、性能优化(如使用缓冲区批量写入),或者在读取字节流后重新构建图片文件。对于后者,可以使用`File.WriteAllBytes()`将字节数组写回磁盘,或者使用`Image`类...